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