C.W.K.
Stream
Lesson 05 of 10 · published

Row Lock 과 Table Lock

~12 min · transactions, locks

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

PostgreSQL 이 자동으로 잡는 lock

행 UPDATE 가 트랜잭션 끝까지 FOR UPDATE-style row lock 잡음. 다른 트랜잭션의 같은 행 두 번째 UPDATE 가 기다림. SELECT 가 row lock 안 잡음 (MVCC 처리) — SELECT ... FOR UPDATE 로 명시 요청 안 하면.

명시적 row locking

업데이트 의도로 행 읽을 때 명시 lock: SELECT ... FOR UPDATE. 두 동시 트랜잭션이 같은 값 읽고 서로 변경 덮어쓰는 'lost update' 방지.

Table-level lock

DDL (ALTER TABLE, DROP TABLE) 이 테이블에 exclusive lock — 실행 중 아무도 read/write 못 함. '스키마 마이그레이션이 프로덕션 30 초 lock 함' 의 치료가 CONCURRENTLY 변형 DDL 존재하는 곳 (CREATE INDEX CONCURRENTLY, REINDEX CONCURRENTLY 등).

Code

SELECT FOR UPDATE — 명시 row lock·sql
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE;
-- 이제 row 1 UPDATE 시도하는 다른 트랜잭션 기다림.
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;
FOR UPDATE SKIP LOCKED — 작업 큐 패턴·sql
-- 다른 worker 가 lock 한 거 스킵, 다음 pending job 가져오기
BEGIN;
SELECT id, payload FROM jobs
WHERE  status = 'pending'
ORDER  BY created_at
LIMIT  1
FOR UPDATE SKIP LOCKED;
-- ... 처리 ...
UPDATE jobs SET status = 'done' WHERE id = ?;
COMMIT;
write 안 막고 인덱스 빌드·sql
-- 테이블 잠깐 lock, 그 다음 exclusive lock 없이 read
CREATE INDEX CONCURRENTLY orders_customer_idx ON orders (customer_id);

External links

Exercise

작은 job 큐 구현: status 있는 jobs 테이블, SELECT ... FOR UPDATE SKIP LOCKED LIMIT 1 하는 worker, job 처리, status UPDATE, COMMIT. worker 두 개 병렬 실행; 같은 job 안 가져가는지 확인.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.