2011-10-24 2 views
1

asp 솔루션 내에 여러 실버 라이트 애플리케이션이 볼트로 고정되어 있으므로 여러 사용자가 동시에 동일한 데이터 세트에서 동일한 애플리케이션을 사용할 수 있습니다. Silverlight 응용 프로그램은 데이터베이스에서 데이터를 가져 와서 로컬에서 작업하고 사용자가 자신의 수정 사항에 만족하면 다시 쓸 수 있도록 설계되었습니다. 그러나이 문제는 두 명의 사용자가 동일한 데이터베이스에서 동일한 응용 프로그램을 사용하는 경우 다른 사용자가 변경 한 내용을 덮어 쓰게됩니다.테이블 SQL 서버 잠그기

많은 데이터베이스가 있기 때문에 한 번에 동일한 데이터베이스를 사용하는 엄청난 수의 사용자가있을 수는 없으며 둘 이상의 사용자가 하나 이상의 동일한 데이터 세트에서 작업해야한다는 것은 중요하지 않습니다. 시각. 내 생각은 단일 사용자가 서버에 읽기/쓰기를 독점적으로 액세스 할 수 있도록 각 테이블을 잠그고 잠긴 테이블을 읽는 다른 사용자 액세스를 거부하는 것입니다.

어떻게 테이블 잠금을 적용하고 해제할까요? 나는 그것이 성명별로 이루어질 수 있다는 것을 알고 있지만, 나는이 데이터에 대한 배타적 권리가 사용자에게 필요하다. 내가 예측할 수있는 문제는 자물쇠를 풀어 놓는 것이므로 일종의 시간 제한이 필요하므로 한 명의 사용자가 테이블을 영구적으로 잠그지 않습니다.

답변

6

하나 이상의 창을 사용하는 사용자 1 명을 포함하여 1 명 이상의 사용자와 관련하여 끔찍한 동시성 문제가 발생하거나 자신의 시스템에서 충돌 후 복귀하는 등의 문제가 발생하기 때문에이 작업을 시도하지는 않겠습니다.

이 문제를 처리하는 간단한 방법은 타임 스탬프 또는 변경 횟수를 사용하는 것입니다. 데이터를 가져온 후 타임 스탬프 또는 변경 횟수가 변경된 경우 사용자에게 다른 사람의 작업을 덮어 쓸 것임을 경고합니다. 그 출발점부터 더 멀리 가서 변경 사항을 선택하고 다른 사람의 변경 사항을 수동으로 복사하고 변경 사항을 비교하게 할 수 있습니다.

1

IMO 데이터베이스 잠금 (물리적으로 SQL 잠금 사용) 또는 논리적으로 (자신의 잠금 테이블 사용) 문제가 될 수 있습니다. 앱의 확장 성을 제한하고 동료가 커피를 나가면 사용자에게 좌절감을 줄 수 있습니다. 또한 사용자가 의도를 나타 내기위한 항목을 체크 아웃하여 잠금을 만들 수 있도록 앱을 디자인해야합니다 (잠금을 원하지 않는 곳에서만 데이터를 검색하는 것과 반대).

Multiversion concurrency control의 패턴. 일반적으로 방해가되지 않는 방법은 레코드 엔티티에 타임 스탬프를 추가하는 것입니다. 그리고 업데이트를 작성하기 직전에 레코드를 다시 가져 와서 타임 스탬프를 비교하여 다른 사용자가 그 중간에 변경 사항이 있는지 확인하십시오.

0

데이터베이스에서 '작업하고있는 것'이 무엇인지 확실하지 않습니다. 그러나 나는 테이블에서 자물쇠를 사용하는 것보다 응용 프로그램에서 다루는 비슷한 문제가있다.

기본적으로 열어서 편집하고 저장할 수있는 다양한 문서 (주문 또는 영수증과 같은)가있다. 내가 Locking을 구현하기 위해 수행 한 작업은 Type, DocID, UserID, LockedTime이있는 테이블을 사용하는 것이 었습니다. DocID 및 유형의 기본 키 (유형은 잠금하려는 유형을 나타내므로 여러 테이블에서이 접근법을 사용할 수 있습니다.)

그런 다음 사용자가 문서를 열려고하면 먼저 문서가 다른 사용자에게 잠겨 있는지 확인하는 SP, 잠긴 경우 열지 못하게하면 읽기 전용 모드가 구현됩니다. 사용자가 변경 사항을 저장하면 다른 사용자가 다시 액세스 할 수 있도록 문서의 잠금을 해제합니다.

이 방법을 사용하는 것이 확실하지는 않지만 기존 테이블을 복잡하게 변경해야하므로 구현이 간단하고 신속합니다.