Appearance
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)
두 개 이상의 트랜잭션이 각각 락을 점유한 상태에서, 서로가 가진 락이 해제되기를 무한정 기다리는 상태.
[발생 예시]
- 트랜잭션 A가 데이터 X에 X-Lock을 획득
- 트랜잭션 B가 데이터 Y에 X-Lock을 획득
- 트랜잭션 A가 데이터 Y에 접근하기 위해 X-Lock을 요청 (B가 점유 중이므로 대기)
- 트랜잭션 B가 데이터 X에 접근하기 위해 X-Lock을 요청 (A가 점유 중이므로 대기) -> Deadlock 발생
Deadlock 해결 방법
예방 (Prevention)
- 각 트랜잭션이 실행되기 전에 필요한 모든 락을 한 번에 요청한다.
- 동시성이 크게 저하되므로 실무에서는 잘 쓰이지 않는다.
회피 (Avoidance)
- 트랜잭션이 자원을 요청할 때 타임스탬프를 사용하여 교착 상태가 발생할 가능성이 있는지 검사한다.
- Wait-Die, Wound-Wait 등의 기법이 있다.
탐지 및 회복 (Detection & Recovery)
- RDBMS 엔진이 주기적으로 Deadlock을 탐지한다.
- 교착 상태를 유발한 트랜잭션 중 하나(일반적으로 작업량이 가장 적은 트랜잭션)를 Rollback(강제 종료) 시켜 순환 대기를 끊는다.
- 대부분의 데이터베이스에서 가장 널리 사용되는 기본 방식이다.