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

MVCC: PostgreSQL 의 동시성 처리

~14 min · transactions, mvcc

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

Multi-Version Concurrency Control

PostgreSQL 이 전통적 read lock 안 씀. 대신, 모든 행 update 가 행의 새 버전 생성. 옛 버전이 어느 트랜잭션도 더 필요 없을 때까지 남아있다가 VACUUM 이 정리. 결과: reader 가 writer 안 막고, writer 가 reader 안 막음. 이게 PostgreSQL 이 read 잘 스케일하는 깊은 이유.

MVCC 가 실전에서 의미하는 거

  • 같은 테이블 쿼리하는 두 reader 가 절대 서로 안 기다림.
  • Reader 가 트랜잭션 (또는 쿼리, isolation 따라) 시작 시점의 snapshot 봄 — 동시 writer 영향 안 받음.
  • 같은 행 update 하는 두 writer 가 서로 막음 (하나가 기다리고, 그 다음 다른 거 결과 봄).
  • 죽은 행 버전 누적; VACUUM 이 주기적으로 정리.

Dead-tuple 비용

PostgreSQL 의 모든 UPDATE 가 "새 버전 생성 + 옛거 죽었다 표시". 무거운 update 테이블이 VACUUM 이 공간 회수할 때까지 dead tuple 누적. 극단 케이스가 bloat; Operations 트랙에서 모니터링 보겠음.

Code

MVCC 실전·sql
-- Session A
BEGIN;
SELECT name FROM users WHERE id = 7;
-- 'Alice' 반환

-- Session B (동시)
BEGIN;
UPDATE users SET name = 'Alicia' WHERE id = 7;
COMMIT;

-- Session A 다시
SELECT name FROM users WHERE id = 7;
-- 'Alice' 반환 (READ COMMITTED) — SELECT 의 snapshot
-- 또는, REPEATABLE READ 에선, A 가 commit 할 때까지 확실히 'Alice'.
COMMIT;

-- 이제 새 트랜잭션
BEGIN;
SELECT name FROM users WHERE id = 7;
-- 'Alicia' 반환
COMMIT;
트랜잭션 visibility 검사·sql
SELECT xmin, xmax, * FROM users WHERE id = 7;
-- xmin: 이 행 버전 만든 트랜잭션
-- xmax: 그걸 삭제/update 한 트랜잭션 (살아있으면 0)

External links

Exercise

psql 두 세션. A 에서 BEGIN + 행 SELECT. B 에서 행 UPDATE, COMMIT. A 에서 다시 SELECT. READ COMMITTED vs REPEATABLE READ vs SERIALIZABLE 에서 보는 거 적어.

Progress

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

댓글 0

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

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