에듀테크 프로젝트 대시보드
격리 수준
동시에 도는 트랜잭션이 서로를 얼마나 볼 수 있는지. PostgreSQL 기본은 Read Committed.
| 수준 | Dirty Read | Non-repeatable | Phantom | 직렬화 이상 |
|---|---|---|---|---|
| Read Committed (기본) | 없음 | 가능 | 가능 | 가능 |
| Repeatable Read | 없음 | 없음 | 없음* | 가능 |
| Serializable | 없음 | 없음 | 없음 | 없음 |
* PostgreSQL 의 Repeatable Read 는 표준보다 강해서 팬텀도 막습니다(스냅샷 격리).
각 문장이 시작될 때의 스냅샷을 봅니다. 같은 트랜잭션 안에서도 SELECT 를 두 번 하면 그 사이 커밋된 변경이 보일 수 있습니다.
-- 갱신 시 다른 트랜잭션이 먼저 커밋했으면, 그 최신 행 기준으로 재평가됨
UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- 안전한 증감BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 트랜잭션 시작 시점 스냅샷 고정. 리포트·정합성 필요한 다중 SELECT 에 좋음
COMMIT;
BEGIN ISOLATION LEVEL SERIALIZABLE;
-- 동시 실행 결과가 '순차 실행 중 하나'와 같음을 보장
COMMIT;for attempt in range(3):
try:
with conn.transaction():
run_logic()
break
except SerializationError:
if attempt == 2: raise
time.sleep(0.05 * 2 ** attempt)