Deadlock이란?
트랜잭션 A가 리소스 1을 잡고 2를 기다리는 동안, B가 2를 잡고 1을 기다리는 순환 대기 상태다.
DB의 대응
대부분 DB는 deadlock detector가 주기적으로 대기 그래프를 검사해 한쪽 트랜잭션을 강제 rollback한다.
ERROR: deadlock detected
DETAIL: Process 1234 waits for ShareLock on tuple ...
예방
- 여러 행을 업데이트할 때 항상 같은 순서로 접근
- 트랜잭션 시간 최소화
SELECT FOR UPDATE SKIP LOCKED로 락 경합 회피log_lock_waits,deadlock_timeout설정으로 모니터링