레코드 잠금

여러 사용자가 레코드를 동시에 업데이트하는 경우, 데이터베이스 잠금 모델은 각 사용자의 업데이트가 하나의 단위로서 성공하도록 하지만 각 업데이트는 이전 업데이트를 겹쳐씁니다.

명시적(비관적) 방식의 잠금 모델은 한 명 이상의 사용자가 동시에 업데이트하는 경우 예상치 못한 데이터 업데이트를 방지하고 워크플로우를 제어합니다.

사용할 수 있는 두 가지 잠금 모델은 다음과 같습니다.

낙관적 방식의 잠금

낙관적 방식의 잠금 모델을 사용하면 여러 사용자가 동시에 레코드를 보고 수정할 수 있지만 첫 번째 사용자를 제외한 다른 사용자는 변경사항을 확약할 수 없습니다. 다른 사용자도 레코드를 업데이트하고자 한다는 것을 사용자에게 알리지 않습니다.

레코드가 확약되면 레코드 변경사항의 유효성이 검증됩니다. 다른 사용자가 레코드를 이미 업데이트한 경우, 사용자가 동시에 업데이트를 제출하면 충돌이 존재한다고 동시 업데이트에 정보가 전달됩니다.

기본적으로 레코드는 ClearQuest 클라이언트 애플리케이션에 표시되는 동안에는 잠기지 않습니다. 결과적으로, 단일 사이트 또는 복제 환경을 사용하는 모든 스키마 디자인이 해당 사항을 고려해야 합니다.

사용자가 적용 단추를 클릭할 때, 다른 사용자가 레코드를 업데이트하며 변경을 처리하는 중 해당 변경을 확약하는지 여부를 검사하여 데이터 무결성을 확인합니다. 그런 경우, 다른 사용자의 일부 변경사항이 유실될 수 있으므로 사용자의 업데이트가 데이터베이스에 확약될 수 없습니다. 다른 사용자가 레코드를 업데이트한 다음 변경을 확약하려는 사용자는 변경이 데이터베이스에 확약되지 않았다는 오류 메시지를 수신합니다.

여러 관련 레코드에 조정된 업데이트와 관련된 복잡한 시나리오에서는 이 동작으로 문제가 발생하지 않도록 주의해야 합니다. 낙관적 방식의 잠금은 각 레코드에 개별적으로 적용되므로, 애플리케이션은 레코드가 올바른 순서로 업데이트되었는지 확인하고 다른 사용자가 조치 시작 및 변경 수행 사이에 하위 레코드를 업데이트한 경우 해당 레코드 업데이트 실패를 처리하도록 해야 합니다. 스키마 디자인이 오퍼레이션을 재시도하거나 실패를 확인 및 상위 레코드의 업데이트를 되돌릴 수 있습니다. 또는, 하위 레코드의 업데이트가 실패하더라도 상위 레코드 업데이트를 확약할 수 있습니다.

스키마 디자인이 레코드가 수정 가능한 경우를 처리해야 합니다.
  • 수정 중에 다른 사용자가 레코드를 수정했으므로 수정이 실패합니다.
  • 하위 레코드는 수정 가능하지만 수정 중에 다른 사용자가 하위 레코드를 수정했으므로 수정이 실패합니다.

비관적 방식의 잠금

비관적 방식의 잠금은 여러 사용자가 레코드를 동시에 편집할 수 없는 메커니즘을 제공합니다. 비관적 방식의 잠금 모델은 레코드를 순차적으로 수정하며 레코드를 동시에 업데이트할 수 없습니다. 사용자가 레코드에 대한 업데이트를 시작하면 이 모델은 해당 레코드에 대한 잠금을 수행합니다. 이 레코드의 업데이트를 시작하려는 다른 사용자에게는 이미 다른 사용자가 업데이트 중임을 알리고 해당 레코드를 수정하지 못하도록 잠급니다. 레코드를 동시에 업데이트하려는 사용자는 첫 번째 사용자가 레코드를 확약할 때까지 대기해야 하며 그런 다음, 다른 사용자에게 잠금이 부여되고 이전 사용자가 변경을 수행한 이후에 변경을 수행할 수 있습니다. 이 모델은 충돌이 발생하지 않도록 방지합니다. 업데이트는 일련화하여 수행되고 각 후속 업데이트는 이전 사용자의 변경사항이 적용되어 이미 업데이트된 레코드로 시작합니다.

단, 다른 사용자가 레코드를 업데이트하지 않도록 잠금을 획득해야 합니다. 이 모델에는 다음을 수행하는 잠금 관리 전략이 필요합니다.
  • 잠금 가져오기
  • 레코드 업데이트를 동시에 수행하고자 하는 사용자가에게 잠금이 해제되도록 대기해야 한다는 것을 알림
  • 잠금이 해제되었음을 알림
  • 포기한 잠금 해제(시스템 충돌 또는 업데이트 완료 간과)

비관적 방식의 레코드 잠금을 사용하려면 해당 잠금을 사용할 레코드 유형에 후크 코드를 추가해야 합니다. 후크 코드는 각 레코드 유형의 새 기본 조치에서 추가해야 합니다. 레코드 스크립트 별명으로 구현된 후크 코드를 사용하여 잠금을 직접 제거할 수 있습니다. ClearQuest 조회를 사용하면 널(null)이 아닌 값과 동일한 locked_by 필드가 포함된 레코드를 검색하여 잠긴 레코드를 찾을 수 있습니다. locked_by 사용자 데이터베이스 열은 레코드를 잠근 경우 사용자의 로그인 ID를 레코드하는 정수 열입니다.

비관적 방식의 잠금은 실질적인 동시 업데이트가 필요하지 않은 경우에 유용하며, 후속 업데이트는 이전 업데이트가 완료될 때까지 지연될 수 있습니다. 이는 일반적으로 업데이트가 매우 짧은 시간 간격으로 발생한다는 것을 의미합니다. 업데이트에서 잠금이 오래 유지되면 다른 사용자가 레코드를 업데이트할 수 없습니다.


피드백