2009-03-06 4 views
5

asp.net 응용 프로그램에서 "비관적 인 잠금"과 같은 것을 구현 한 경험이있는 사람의 조언을 듣고 싶습니다. 이것은 내가 찾고 있어요 동작입니다 :asp.net 애플리케이션에서 "비관적 잠금"을 어떻게 구현합니까?

  1. 사용자 A은 주문 번호를 순서 번호 (313)를 엽니 다 (313)
  2. 사용자 B 시도를 열지 만 사용자 A가 순서가 X 분 전용으로 오픈 한 것을 이야기한다. 내가 전에이 기능을 구현하지 않은 때문에

, 나는 몇 가지 디자인 질문 :

내가 주문 기록에 첨부해야 어떤 데이터
  • ? 나는 고려 중이 야 :
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

을 나는 LockRefreshedTime < 경우 잠금이 해제 기록 고려할 것 (지금 - 10 분).

  • 잠금 장치가 필요 이상으로 길지는 않지만 예기치 않게 만료되지 않도록 보장하려면 어떻게해야합니까?

저는 jQuery에 매우 익숙하여 클라이언트 스크립트를 사용하는 방법을 환영합니다. 이것은 내부 웹 어플리케이션이므로 대역폭/사이클을 자유롭게 사용할 수 있습니다. 또한 "비관적 잠금"이이 개념에 적합한 용어인지 궁금합니다.

답변

8

당신이 그곳에있는 것처럼 보입니다. 나는 정말로 당신이 LockRefreshedTime을 필요로하지 않는다고 생각하지만, 실제로 아무것도 추가하지 않는다. LockAcquiredTime을 사용하여 잠금이 오래되지 않은 시점을 결정할 수 있습니다.

다른 작업을 수행하려면 트랜잭션을 사용해야합니다. 데이터베이스 트랜잭션 내에서 잠금의 확인 및 설정을 래핑해야하므로 유효한 잠금이 있다고 생각하는 두 명의 사용자가되지 않습니다.

두 개 이상의 리소스에서 잠금을 확보해야하는 작업 (예 : 주어진 유형의 레코드가 두 개 이상이거나 레코드 유형이 두 개 이상인 경우)을 수행 할 때마다 동일한 순서로 잠금을 적용해야합니다. 잠금. 그렇지 않으면 죽은 자물쇠가 생길 수 있습니다. 코드의 한 비트는 잠긴 상태이며 A 레코드는 잠겨 있고 B 코드는 잠겨 있고 A 레코드를 기다리고 있습니다.

자물쇠가 없는지 확인하는 방법 예기치 않게 갑자기 출시되었습니다. 잠금 시간 종료보다 오래 실행될 수있는 장기 실행 프로세스가있는 경우 잠금 실행 시간 동안 잠금을 새로 고칩니다.

"명시 적 잠금"이라는 용어는이 잠금 시간을 설명하는데도 사용됩니다.

+0

+1 훌륭한 답변, 감사합니다. 더 많은 답변을 장려하기 위해 24 시간 동안 질문에 답변하지 않을 것입니다. –

+0

브라우저를 열어두고 점심이나 휴가를가는 사람을 조심하십시오. 사용자 또는 관리자가 다른 사람의 잠금을 해제 할 수있는 UI가 필요한지 고려하십시오. (경험에서 말하기.) –

1

나는 이것을 수동으로했다.

  • 레코드의 기본 키를 잠금 테이블에 저장하고 편집 할 레코드 레코드를 표시하십시오.
  • 다른 사용자가이 레코드를 선택하려고하면 사용자의 준비 만 된 레코드를 표시하십시오.
  • 최대 레코드 잠금 시간을 설정하십시오.
  • 잠긴 레코드의 페이지 데이터를 새로 고칩니다. 사용자가 변경을 허용하는 동안 다른 모든 사용자는 확인 만 허용됩니다.

    User_ID, //who locked 
    Lock_start_Time, 
    Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row. 
    Table_Name(Entity_Name) //table name of the locked row. 
    

    남은 논리는 파악해야 뭔가 :

잠금 테이블과 유사한 디자인을해야한다.

이것은 4 년 전 고객의 특별한 요청에 대해 구현 한 아이디어입니다. 그 클라이언트 후에 아무도 비슷한 것을하기 위해 다시는 아무에게도 물지 않았다. 그래서 나는 다른 어떤 방법도 얻지 못했다.

관련 문제