우리는 "레코드 잠금"DB 레코드에 대한 몇 가지 변형을 사용하여 독립적으로 두 가지 상황에서 회사에서이를 해결했습니다. 한 시스템에서 레코드가 새 항목으로 "대기열"에 들어갈 때 잠금 레코드가 생성됩니다. 다른 하나는 사용자가 큐에서 레코드를 가져올 때 잠금 레코드가 만들어집니다.
소프트웨어의 사용자 복사본이 작업 대기열 레코드를 열 때 잠금 기록은 사용자에게 기록 된 사용자에 대한 고유 한 식별 정보와 함께 DB에 있어야합니다. 잠금 상태 인 레코드와 레코드 잠금 레벨 (동일한 레벨에있는 두 개의 잠금이 동일한 레코드에 존재할 수 없음을 의미)에서 고유해야하며, 레코드를 연 사용자를 변경 목적으로 "소유"한 것으로 식별해야합니다 . 이 잠금 레코드는 사용자가 자신의 소프트웨어에서 레코드를 연 상태 인 한 계속 유지되어야합니다.
잠금을 "중단"하는 기능은 잠금 장치를 다른 사용자에게 간단히 재 할당하고 원래 잠금 장치의 소프트웨어에 의한 잠금 개체를 정기적으로 폴링하여 수행 할 수 있습니다. 사용자가 더 이상 소유자가 아니면 잠금 장치가 "고장났다"고 사용자가 잠금을 다시 획득하거나 (다른 사용자의 새 잠금을 깨뜨림) 또는 단순히 계속 진행할 수있는 옵션이 있습니다.
사용자의 소프트웨어가 충돌하면 여전히 레코드에 대한 잠금이 설정됩니다. 또한 잠금을 제거하는 작업이 실패 할 수도 있습니다 (실제 데이터가 다른 DB에 있으며 범용 트랜잭션을 적용 할 수없는 상황에서 발생할 수 있음). 이 경우 "고아"잠금을 제거하거나 사용자가 강제로 제거하도록하는 메커니즘이 필요합니다. 잠긴 항목이 시간에 민감한 경우 여러 중복 수준의 잠금 제거를 설계해야합니다 (분당 한 번 X 분보다 오래된 잠금을 해제하거나 "고아"로 알려진 시간이 지정된 작업 일 수 있습니다. 해당 사용자가 더 이상 로그인하지 않은 경우).
니스. 나는 해결책을 좋아했다. 불필요한 타이머 등에 빠지지 않고 읽은 가장 우아한 하나 – Jaggu