Skip to content

Lock (Shared/Exclusive) & Deadlock

데이터베이스에서 여러 트랜잭션이 동일한 데이터에 동시에 접근할 때, 데이터의 무결성과 일관성을 보장하기 위해 사용하는 동시성 제어 기법이다.

1. Lock의 종류

Shared Lock (공유 락, S-Lock)

  • 읽기(Read) 작업을 위한 락.
  • 데이터를 읽을 수는 있지만, 변경(Update/Delete)은 할 수 없다.
  • S-Lock끼리는 호환된다. 즉, 하나의 데이터에 여러 트랜잭션이 동시에 S-Lock을 걸고 읽을 수 있다.
  • X-Lock이 걸린 데이터에는 S-Lock을 걸 수 없다.

Exclusive Lock (배타 락, X-Lock)

  • 쓰기(Write) 작업을 위한 락.
  • 데이터를 변경(Insert/Update/Delete)할 때 사용한다.
  • 어떤 락과도 호환되지 않는다. 즉, X-Lock이 걸린 데이터는 다른 트랜잭션에서 S-Lock이나 X-Lock을 걸 수 없다.
  • 트랜잭션이 완료(Commit/Rollback)될 때까지 유지된다.

2. 교착 상태 (Deadlock)

두 개 이상의 트랜잭션이 각각 락을 점유한 상태에서, 서로가 가진 락이 해제되기를 무한정 기다리는 상태.

[발생 예시]

  1. 트랜잭션 A가 데이터 X에 X-Lock을 획득
  2. 트랜잭션 B가 데이터 Y에 X-Lock을 획득
  3. 트랜잭션 A가 데이터 Y에 접근하기 위해 X-Lock을 요청 (B가 점유 중이므로 대기)
  4. 트랜잭션 B가 데이터 X에 접근하기 위해 X-Lock을 요청 (A가 점유 중이므로 대기) -> Deadlock 발생

Deadlock 해결 방법

  1. 예방 (Prevention)

    • 각 트랜잭션이 실행되기 전에 필요한 모든 락을 한 번에 요청한다.
    • 동시성이 크게 저하되므로 실무에서는 잘 쓰이지 않는다.
  2. 회피 (Avoidance)

    • 트랜잭션이 자원을 요청할 때 타임스탬프를 사용하여 교착 상태가 발생할 가능성이 있는지 검사한다.
    • Wait-Die, Wound-Wait 등의 기법이 있다.
  3. 탐지 및 회복 (Detection & Recovery)

    • RDBMS 엔진이 주기적으로 Deadlock을 탐지한다.
    • 교착 상태를 유발한 트랜잭션 중 하나(일반적으로 작업량이 가장 적은 트랜잭션)를 Rollback(강제 종료) 시켜 순환 대기를 끊는다.
    • 대부분의 데이터베이스에서 가장 널리 사용되는 기본 방식이다.