40P01: deadlock_detected
PostgreSQL의미
둘 이상의 트랜잭션이 서로가 보유한 락을 기다리며 데드락에 빠졌다. PostgreSQL은 순환을 감지해 트랜잭션 중 하나를 취소한다.
원인
서로 다른 순서로 획득한 락, 같은 행에 대한 교차 갱신, 긴 트랜잭션, 또는 외래 키 검사 중 걸리는 충돌 락.
해결 방법
서버 로그의 데드락 상세가 충돌하는 쿼리를 보여 준다. 모든 트랜잭션에서 같은 순서로 테이블/행에 접근한다. 트랜잭션을 짧게 유지한다. 취소된 트랜잭션은 애플리케이션에서 잡아 재시도한다. pg_locks와 pg_stat_activity를 조인해 락을 분석한다. 필요하면 SELECT ... FOR UPDATE로 락 순서를 명시한다.