PostgreSQL

PostgreSQL: Transaction Isolation Level

dewstream 2025. 7. 31. 08:00
728x90

※ PostgreSQL: Transaction Isolation Level.

 

안녕하세요. 듀스트림입니다.

 

오늘 포스팅은 트랜잭션 격리 수준에 관한 내용입니다.


PostgreSQL도 MySQL과 마찬가지로
ANSI SQL 표준에 따라 Transaction Isolation Level을 설정할 수 있습니다.

1. ANSI SQL 표준 격리 수준

격리 수준 설명 PostgreSQL 지원 여부 MySQL 지원 여부
READ UNCOMMITTED 커밋되지 않은 변경사항도 다른 트랜잭션에서 읽을 수 있음 (Dirty Read 가능) (자동으로 READ COMMITTED로 동작)
READ COMMITTED 커밋된 변경사항만 읽을 수 있음. 같은 쿼리라도 트랜잭션 중간에 실행하면 다른 결과 가능 ✅ 기본값 ✅ 기본값
REPEATABLE READ 트랜잭션 내에서 같은 쿼리는 항상 동일한 결과를 반환 (Phantom Read는 방지되지 않음)
SERIALIZABLE 완전한 직렬화 보장. 트랜잭션 간 동시 실행을 마치 순차 실행처럼 처리 (Conflict 시 rollback)

2. PostgreSQL에서 격리 수준 설정 방법

▸ 트랜잭션 단위 설정

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 또는
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- 쿼리 실행

 

▸ 세션 단위 설정

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 다음 BEGIN 이후 트랜잭션부터 적용됨
BEGIN;
-- 쿼리 실행

 

▸ 서버 전역 기본값 설정

# postgresql.conf
default_transaction_isolation = 'read committed'

 

+ MySQL 설정 방법

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
-- 쿼리 실행

3. PostgreSQL Transaction Isolation Level 특징

격리 수준 Dirty Read Non-Repeatable Read Phantom Read MVCC 동작
Read Committed 쿼리 단위(쿼리 실행 시점) 스냅샷 사용 (동시 수정 반영 가능)
Repeatable Read 트랜잭션 단위 스냅샷 사용
Serializable SSI(Serializable Snapshot Isolation)를 통한 충돌 탐지 및 롤백 (팬텀 포함 직렬성 완전 보장)
PostgreSQL은 Serializable을 구현할 때 2-Phase Locking 방식이 아닌 Serializable Snapshot Isolation (SSI) 기법을 사용합니다. 즉, 실제로는 REPEATABLE READ와 유사한 방식으로 동작하지만 동시성 충돌 발생 시 자동으로 롤백시켜 직렬성을 보장합니다.

 

+ 용어 정리

개념 설명 예시
Non-Repeatable Read 같은 트랜잭션 내에서 같은 SELECT를 두 번 했을 때 다른 결과가 나오는 현상 트랜잭션 A가 SELECT한 후, 트랜잭션 B가 그 행을 UPDATE하고 커밋 → A가 다시 SELECT하면 값이 바뀜
Phantom Read 같은 조건의 SELECT를 두 번 했을 때 처음엔 없던 행이 두 번째에는 보이는 현상 트랜잭션 A가 WHERE age > 30 조건으로 SELECT → 트랜잭션 B가 age=35인 새 행을 INSERT하고 커밋 → A가 다시 SELECT하면 새 행이 보임

오늘은 여기까지~

 

728x90