본문 바로가기
C.W.K.
Stream
Lesson 04 of 10 · published

MVCC가 동시성을 다루는 법

~14 min · transactions, mvcc

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

행을 덮어쓰기보다 새 버전을 만든다

PostgreSQL은 UPDATE 때 기존 행을 즉시 지우지 않고 새 버전을 만들어. 각 트랜잭션의 스냅샷은 자신에게 보이는 버전을 골라 읽어. 읽기는 쓰기를 막지 않고 쓰기는 읽기를 막지 않지만, 두 트랜잭션이 같은 행을 갱신하면 한쪽이 다른 쪽을 기다려.

보이지 않는 옛 버전은 나중에 정리해

아직 오래된 스냅샷이 필요할 수 있으므로 이전 행 버전을 바로 버릴 수 없어. 어느 트랜잭션도 필요로 하지 않게 되면 VACUUM이 공간을 다시 쓸 수 있게 표시해. 긴 트랜잭션은 이 정리를 늦춰 부풀림을 만들 수 있어.

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;
트랜잭션에서 보이는 행 버전 확인하기·sql
SELECT xmin, xmax, * FROM users WHERE id = 7;
-- xmin: 이 행 버전 만든 트랜잭션
-- xmax: 그걸 삭제/update 한 트랜잭션 (살아있으면 0)

External links

Exercise

psql 세션 2개를 열어 A에서 BEGIN 후 행을 조회하고, B에서 같은 행을 UPDATE한 뒤 COMMIT해. A에서 다시 조회했을 때 READ COMMITTED, REPEATABLE READ, SERIALIZABLE이 각각 무엇을 보여 주는지 기록해.

Progress

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

댓글 0

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

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