2010-07-05 1 views
3

나는두 멤버가 액세스하려고하면 레코드를 잠그는 방법은 무엇입니까?

내 환경이 .Net2.0, VS 2008 웹 응용 프로그램 두 멤버가 동시에 액세스하려고 할 때 내가 기록을 잠글 필요가

이다,이 같은 시나리오가 있습니다.

우리는 (sessionid를 퍼팅과 사전에 고유 번호를 기록하고 정적 또는 응용 프로그램 변수로 유지) 전면 말까지, 두 가지 방법으로

  1. 그것을 할 때 응답, 우리는 발표 할 예정 수 해당 페이지에서 나가고, 게시 버튼을 클릭하고 세션이 종료 된 후 클라이언트가 연결되어 있지 않습니다.

  2. 백엔드 (DB 자체에서 레코드 잠금 - 연구해야 함 - 팀원이보고 있음).

다른 방법이 있습니까? 각 단계마다 다른 방법을 찾아야합니까?

조건을 찾을 수 있습니까?

+0

이미 데이터베이스를 사용하고 있다면 데이터베이스 트랜잭션을 사용하여 원하는 것을 얻을 수 있습니까? 트랜잭션 내에서 읽기/업데이트를 수행하고 충돌이 발생하면 DB는 실패한 트랜잭션을 롤백 한 다음 실패를 처리합니다. – sarnold

+2

첫 번째 질문 : ** 왜 ** 잠금해야합니까 ?? 일반적으로 오늘의 데이터베이스는 낙관적 인 동시 처리를 사용합니다. 기본적으로 모든 것이 잘된다고 가정합니다 (99 %의 시간이 소요됩니다). 잠금 장치 등을 신경 쓰지 않아도됩니다. 충돌이 발생합니다. –

+1

@sarnold : ASP.NET에 대한 생각은 아니지만 사용자가 브라우저에서 데이터를 입력/변경하는 동안 연결/트랜잭션을 열어 두시겠습니까? 그가 브라우저를 닫으면 어떻게 될까요? 더 이상 유효하지 않은 정리 잠금에 대한 추가 코드가 필요합니다. – Gertjan

답변

6

몇 밀리 초 이상 동안 레코드를 잠그는 것은 데이터베이스에서 할 수있는 가장 위험한 작업 일 뿐이므로 클라이언트 레코드를 잠그지 마십시오. 대신 Optimistic Concurrency을 사용해야합니다 : 마지막으로 읽은 후 레코드가 변경된 경우 검색하고 트랜잭션을 다시 시도하십시오 (예 : 화면을 사용자에게 다시 표시). 실제로 구현되는 방법은 사용하는 DB 기술 (ADO.Net, DataSets, Linq, EF 등)에 따라 다릅니다.

비즈니스 도메인에 잠금과 같은 동작이 필요한 경우 해당 비즈니스 로직은 항상 데이터베이스의 예약 논리로 구현됩니다. 레코드가 표시되면 다른 사용자가 동일한 트랜잭션을 시도 할 수 없도록 '예약'되어 있습니다. 예약이 완료되거나 시간이 초과되거나 취소됩니다. 그러나 '예약'은 잠금을 사용하여 절대로 수행되지 않으며, 항상 '사용 가능'에서 '예약 된'상태 또는 이와 유사한 상태로 명시 적으로 업데이트됩니다.

이 패턴은 또한 EAA의 din P : Optimistic Offline Lock을 설명합니다.

0

SQL 서버 데이터베이스의 레코드에서 데이터를 읽는 것에 대해서만 이야기하면 아무 것도 할 필요가 없습니다 !!! SQL 서버는 레코드에 대한 다중 액세스를 관리하는 모든 것을 처리합니다. 그러나 데이터를 조작하려면 Transaction을 사용해야합니다.

0

나는 Ramus와 동의합니다. 하지만 아직도 필요하다면. IsInUse와 같은 이름의 열을 비트 유형으로 작성하고 액세스중인 경우 true로 설정하십시오. 다른 사람들은 같은 시간에 동일한 데이터가 필요하므로 충돌로부터 앱을 저장해야합니다. 데이터가 검색된 모든 위치에서 IsInUse가 거짓인지 확인해야합니다.