PostgreSQL lock_timeout으로 잠금 대기 끊기
조회 0 · 댓글 0
마이그레이션이나 배포 중에 ALTER TABLE 같은 DDL이 다른 트랜잭션이 쥔 잠금 때문에 무한정 대기하면, 그 뒤에 줄 선 세션까지 연쇄로 막히는 경우가 있습니다. 이럴 때 lock_timeout으로 잠금 획득 대기 시간만 끊어주면 됩니다. 지정한 시간을 넘겨 잠금을 못 잡으면 그 statement만 중단됩니다. 기본값은 0(비활성)이고, 단위 없이 숫자만 적으면 밀리초로 읽습니다.
전역(postgresql.conf)에 걸면 모든 세션에 영향을 줘서 공식 문서도 권장하지 않습니다. 작업하는 트랜잭션 안에서만 SET LOCAL로 거는 방식을 권합니다.
BEGIN;
SET LOCAL lock_timeout = '3s';
ALTER TABLE orders ADD COLUMN memo text;
COMMIT;주의할 점은 statement_timeout과 다르다는 것입니다. lock_timeout은 잠금을 기다리는 동안에만 발동하고, statement 실행 전체 시간을 재지는 않습니다. 그래서 statement_timeout을 lock_timeout과 같거나 크게 잡으면 잠금 타임아웃이 발동할 기회 없이 statement 타임아웃이 먼저 걸려 의미가 없어집니다. lock_timeout을 더 짧게 두는 편이 맞습니다.
🔗 https://www.postgresql.org/docs/current/runtime-config-client.html
로그인 후 답글을 남길 수 있습니다.