트랜잭션 격리 수준
PostgreSQL의 트랜잭션 격리 수준에는 어떤 것이 있나요?
격리 수준은 트랜잭션이 동시에 실행 중인 다른 트랜잭션의 변경 사항을 얼마나 볼 수 있는지 결정합니다. PostgreSQL의 기본값은 Read Committed이며, Repeatable Read와 Serializable도 제공합니다.
SQL 표준은 허용하는 이상 현상에 따라 네 가지 격리 수준을 정의합니다. 이상 현상에는 더티 읽기, 반복 불가능한 읽기, 팬텀 읽기, 직렬화 이상이 있습니다. PostgreSQL은 네 가지 수준 이름을 모두 받아들이지만 Read Uncommitted는 Read Committed처럼 동작하므로, 실제로는 Read Committed, Repeatable Read, Serializable의 세 가지입니다.
기본값인 Read Committed는 문마다 새 스냅샷을 제공하므로, 같은 트랜잭션 안의 두 쿼리가 서로 다른 데이터를 볼 수 있습니다. Repeatable Read는 트랜잭션 전체에서 하나의 스냅샷을 사용합니다. Serializable은 동시 트랜잭션이 하나씩 차례로 실행된 것처럼 동작하도록 검사를 추가합니다. 더 엄격한 두 수준에서는 트랜잭션이 직렬화 오류로 실패할 수 있으며, 애플리케이션은 해당 트랜잭션을 재시도해야 합니다.
예제
이 예제는 서버의 기본 수준을 표시한 다음 Repeatable Read 트랜잭션을 시작하고 SHOW transaction_isolation으로 이를 확인합니다. 해당 트랜잭션 안의 모든 읽기는 같은 스냅샷을 사용합니다.
CREATE TABLE stock (sku text PRIMARY KEY, qty int);
INSERT INTO stock VALUES ('A-1', 5);
SHOW default_transaction_isolation;
BEGIN ISOLATION LEVEL REPEATABLE READ;
SHOW transaction_isolation;
SELECT qty FROM stock WHERE sku = 'A-1';
COMMIT;확장 없이 기본 PostgreSQL 16 또는 17에서 실행되는 일반 SQL입니다. 버려도 되는 빈 데이터베이스에서 실행하세요.
출처
PostgreSQL 공식 문서(영문)입니다.