PostgreSQL이 자동으로 잡는 잠금
행을 UPDATE하면 트랜잭션이 끝날 때까지 FOR UPDATE와 비슷한 행 잠금을 잡아. 다른 트랜잭션이 같은 행을 바꾸려 하면 기다리지만, 보통 SELECT는 MVCC로 읽을 뿐 잠그지 않아.
바꿀 의도로 읽는다면 명시해
SELECT ... FOR UPDATE는 읽은 행을 잠가 확인 뒤 갱신하는 사이에 다른 쓰기가 끼어들지 못하게 해. 다시 말해 SELECT ... FOR UPDATE를 써야 할 자리는 단순 읽기가 아니라 이어질 변경의 경계야.
테이블 수준 잠금과 온라인 DDL
ALTER TABLE이나 DROP TABLE 같은 DDL은 넓은 잠금을 요구할 수 있어. 운영 환경에서 30초 동안 읽기와 쓰기를 막는 변경은 장애가 돼. 가능한 작업이라면 CONCURRENTLY를 지원하는 방식을 쓰고, 단순한 FOR UPDATE만으로 해결할 수 없는 잠금 범위를 배포 전에 확인해.