다중 버전 동시성 제어(MVCC)
PostgreSQL의 MVCC란 무엇인가요?
MVCC를 사용하면 읽기와 쓰기가 동시에 실행될 수 있습니다. 각 문은 데이터의 스냅샷을 보고, 업데이트는 행을 제자리에서 덮어쓰는 대신 새 행 버전을 기록합니다.
다중 버전 동시성 제어(MVCC)는 PostgreSQL이 동시 트랜잭션들을 서로 기다리게 하지 않으면서 일관성을 유지하는 방식입니다. 각 문은 특정 시점의 데이터 스냅샷을 보므로, 읽기가 쓰기를 막지 않고 쓰기도 읽기를 막지 않습니다.
내부적으로 UPDATE는 행의 새 버전을 기록하고 이전 버전을 만료된 것으로 표시합니다. 숨겨진 시스템 열 xmin과 xmax는 각 버전을 어떤 트랜잭션이 만들고 만료시켰는지 기록합니다. 이전 버전은 VACUUM이 제거할 때까지 테이블에 남아 있으며, 그래서 매우 긴 트랜잭션은 테이블을 커지게 만들 수 있습니다.
예제
이 예제는 UPDATE 전후에 숨겨진 xmin 열을 읽습니다. 업데이트가 해당 업데이트 트랜잭션의 ID가 찍힌 새 행 버전을 기록했기 때문에 값이 바뀝니다.
CREATE TABLE accounts (id int PRIMARY KEY, balance int);
INSERT INTO accounts VALUES (1, 100);
SELECT xmin, xmax, * FROM accounts;
UPDATE accounts SET balance = 90 WHERE id = 1;
SELECT xmin, xmax, * FROM accounts;확장 없이 기본 PostgreSQL 16 또는 17에서 실행되는 일반 SQL입니다. 버려도 되는 빈 데이터베이스에서 실행하세요.
출처
PostgreSQL 공식 문서(영문)입니다.