2008-10-03 7 views
2

잠금에 관한 질문이 있습니다. 이것은 레코드 잠금에 관한 것만은 아니지만 어쨌든.레코드 잠금을 구현하는 가장 좋은 방법은 무엇입니까?

웹에서 액세스 할 수있는 CMS를 작성하고 있다고 가정 해 보겠습니다. 나는 몇 가지 아이디어로 고심하고있다.

사용자가 편집을 위해 기사를 열면 기사를 '사용 중'으로 표시 할 수 있습니다. 여태까지는 그런대로 잘됐다.

언제 플래그를 제거합니까? 사용자가 기사를 저장할 때? 사용자가 더 이상 타이핑을하지 않고 브라우저를 닫고 잠자리에 들기로 결심했다면 어떨까요?

타임 아웃 메커니즘이 마음에 들지만 기사를 작성하는 데 얼마나 걸립니까? 너무 짧은 10 분, 30 분이 너무 긴 ..

아마도 나는 이것을 복잡하게 만든다. 이 주제에 대한 당신의 생각을 듣고 싶습니다.

답변

2

타임 스탬프를 사용하지 않는 이유는 무엇입니까? 실제로 아무것도 잠그는 것에 대해 걱정하지 마십시오. 레코드 (기사)가 변경된 이벤트에 반응하십시오.

기본적으로 기사를 저장하기 전에 버전 (타임 스탬프)이 디스크에있는 것과 같은지 확인하십시오. 동일하면 여전히 최신 사본이 있으므로 작성하지 않으면 병합 제안, 새 것으로 저장 제안, 폐기 - 응용 프로그램마다 다릅니다.

+0

합병 알고리즘이 소리가 나면 복사/수정/병합은 일반적으로 잠금/편집/잠금 해제보다 번거롭고 걱정이 적습니다. – Rob

2

내 투표는 가능한 경우 optimistic locking입니다.

실제 잠금을 구현 한 곳에서는 잠금을 제거 할 관리자 페이지가있었습니다. 또한 해당 활성 세션이없는 잠금을 해제하기 위해 서버에서 실행중인 서비스가 있습니다.

0

mssql 2005 이상에서 rowversion을 사용하고 mssql 2000 이하에서 timestamp를 사용하십시오. postgresql에 대해 숨겨진 xmin 필드를 사용하십시오.

다른 모든 사용자가 레코드를 열도록하십시오. 레코드를 저장 한 사람, 레코드를 저장 한 태그 및 rowversion을 사용하여 catch (DbConcurrencyException)에서 레코드를 저장 한 다른 사용자가 레코드를 다시 저장하도록 요청한 오류를 다시 던지고 레코드를 다시 열도록 요청합니다 먼저 레코드를 저장 한 사용자가 변경 한 사항을 확인하십시오.

관련 문제