두 트랜잭션, 반대 순서
Deadlock 은 트랜잭션 A 가 행 X lock 잡고 행 Y 기다리고, B 가 Y 잡고 X 기다릴 때. 둘 다 못 진행. PostgreSQL 이 cycle 감지 + 한 쪽 abort (40P01 deadlock_detected 에러).
Deadlock 레시피
UPDATE 두 개, 행 두 개, 반대 순서로 접근. 실제 시스템의 거의 모든 deadlock 이 이 패턴의 변형.
두 가지 예방
- 모든 코드 경로에서 같은 순서로 행 update. 항상 row 1 그 다음 row 2 건드리면, 같은 거 하는 다른 트랜잭션과 절대 deadlock 안 남.
- Catch and retry. 실제 워크로드에서 deadlock 이 가끔 피할 수 없음. 트랜잭션을 retry loop 로 (backoff 와) 감싸고 40P01 을 복구 가능 에러로 다룸.