SELECT 1
스냅샷 A
SELECT 2
스냅샷 B
같은 트랜잭션이어도 다음 문장은 더 최신 커밋을 다시 볼 수 있습니다.
둘 다 MVCC 읽기라서 일반 SELECT는 잠금을 잡지 않습니다. 차이는 스냅샷을 언제 고정하느냐와 오래된 버전을 유지하는 부담입니다.
|
Oracle
문장마다 읽기 시점을 다시 잡음
기본 감각은
READ COMMITTED 중심입니다.
|
InnoDB
같은 트랜잭션 스냅샷을 오래 유지 가능
기본 감각은
REPEATABLE READ 중심입니다.
|
|
|---|---|---|
| RC에서 다시 SELECT |
새 문장이면 새 스냅샷
SELECT 1
스냅샷 A
SELECT 2
스냅샷 B
같은 트랜잭션이어도 다음 문장은 더 최신 커밋을 다시 볼 수 있습니다. |
ReadView도 SELECT마다 새로 생성
SELECT 1
ReadView A
SELECT 2
ReadView B
|
| 같은 스냅샷을 계속 쓰는가 |
기본 모델은 아님
핵심
읽기 일관성 기준이 문장 시작 시점에 묶입니다.
의미
트랜잭션 전체가 같은 화면을 계속 보는 구조와는 다릅니다.
|
REPEATABLE READ면 첫 SELECT 시점으로 고정
첫 SELECT
ReadView A 생성
다음 SELECT
같은 A 재사용
트랜잭션 안에서는 반복 조회 결과를 더 안정적으로 유지합니다. |
| 기본 격리 수준이 주는 감각 |
READ COMMITTED
매 문장이 시작할 때의 최신 커밋 상태를 기준으로 읽습니다. |
REPEATABLE READ
첫 일관성 읽기 기준을 오래 유지해서 같은 트랜잭션 안의 조회를 고정합니다. |
| 오래된 버전을 붙잡는 비용 |
ORA-01555 위험
긴 읽기 동안 필요한 undo가 덮이면 과거 버전을 재구성하지 못할 수 있습니다. |
Undo Log 비대화
purge가 밀리면 히스토리 길이와 공간 사용량이 커집니다. |
일반 SELECT는 둘 다 잠금 없이 읽고, 반대로 쓰기와 쓰기 충돌은 둘 다 행 잠금으로 대기합니다. MVCC가 읽기 경쟁을 줄여도 쓰기 충돌까지 없애지는 않습니다.