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 트랙에서 모니터링 보겠음.