1. 기본
- 트랜잭션 시작(
BEGIN
) 이후 LOCK
을 사용할 수 있다.
- 트랜잭션 종료(
COMMIT
or ROLLBACK
) 시 LOCK
이 종료된다.
LOCK TABLE {스키마}.{테이블} IN ACCESS EXCLUSIVE MODE;
LOCK TABLE {스키마}.{테이블} IN SHARE UPDATE EXCLUSIVE MODE;
ACCESS EXCLUSIVE
: Lock에 걸린 동안 다른 세션이 읽기/쓰기 불가능
SHARE UPDATE EXCLUSIVE
: Lock에 걸린 동안 다른 세션이 읽기 가능/쓰기 불가능
2. 응용: 스키마 단위 락
BEGIN;
DO $$
DECLARE
r RECORD;
s VARCHAR DEFAULT 'public';
BEGIN
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = s) LOOP
EXECUTE 'LOCK TABLE ' || s || '.' || r.tablename || ' IN SHARE UPDATE EXCLUSIVE MODE';
END LOOP;
END $$;
-- DO SOMETHING HERE --
COMMIT;