DBMS 차이

같은 격리 수준 이름도 구현 축을 확인해야 한다

잠금 기반과 MVCC는 방향을 설명하는 축일 뿐입니다. 실제 DBMS는 일반 읽기, 잠금 읽기, 범위 조건, 직렬화 충돌 감지를 서로 다르게 조합하므로 같은 SQL도 제품과 옵션에 따라 대기하거나 실패할 수 있습니다.

일반 읽기 스냅샷인지 현재 행 잠금인지 먼저 본다.
잠금 읽기 DML과 SELECT FOR UPDATE의 대기 범위를 본다.
범위 보호 gap, key-range, SSI처럼 팬텀을 막는 방식을 본다.
실패 경로 deadlock, timeout, serialization failure를 재시도한다.

제품명보다 먼저 볼 네 가지 동작

시험용 표의 격리 수준 이름을 외운 뒤에는, 아래 구현 차이가 실제 대기와 재시도를 만든다.

확인 축
PostgreSQL MVCC + SSI

READ UNCOMMITTED는 사실상 READ COMMITTED로 동작한다.

InnoDB MVCC + next-key lock

일관 읽기와 잠금 읽기의 차이가 크다.

Oracle undo 기반 읽기 일관성

문장 단위 스냅샷 읽기가 기본 감각이다.

SQL Server 락 기본 + 버전 옵션

row versioning 옵션에 따라 체감이 달라진다.

일반 읽기 SELECT가 쓰기를 막는가
스냅샷

문장 또는 트랜잭션 스냅샷에서 읽고 쓰기와 덜 충돌한다.

일관 읽기

일관 읽기는 버전을 보지만, 잠금 읽기는 행과 범위를 잠근다.

읽기 일관성

undo 정보를 이용해 SQL 시작 시점의 일관된 결과를 본다.

버전 옵션

기본 READ COMMITTED는 락 중심이고 RCSI를 켜면 버전 읽기다.

범위 조건 phantom과 조건 불변식
SSI

SERIALIZABLE은 위험한 의존성을 감지해 한쪽을 실패시킨다.

gap lock

격리 수준과 인덱스 조건에 따라 next-key/gap lock이 걸린다.

스냅샷

SERIALIZABLE에서 트랜잭션 스냅샷 충돌이 실패로 드러날 수 있다.

key-range

SERIALIZABLE은 조건 범위를 key-range lock으로 보호한다.

충돌 결과 정상적인 실패 경로
재시도

serialization failure는 애플리케이션 재시도 대상이다.

대기/데드락

lock wait timeout과 deadlock을 업무 재시도 정책에 넣는다.

ORA-08177

직렬화 충돌은 트랜잭션 재실행으로 다룬다.

데드락

락 대기, 데드락, snapshot conflict를 모두 정상 흐름으로 본다.

일반 SELECT 일반 읽기는 스냅샷 범위가 핵심

READ COMMITTED가 문장마다 새 결과를 보는지, 트랜잭션 동안 같은 결과를 보는지부터 확인한다.

UPDATE / SELECT FOR UPDATE 쓰기와 잠금 읽기는 대기 범위를 만든다

인덱스가 부실하면 행 하나가 아니라 조건 범위까지 잠길 수 있어 실행 계획도 함께 봐야 한다.

SERIALIZABLE 강한 격리는 실패를 없애지 않는다

제품에 따라 대기, key-range lock, SSI 실패처럼 표현만 다르고 재시도 설계는 여전히 필요하다.

문서와 설정을 같이 확인한다
1 현재 기본 격리 수준과 세션별 override를 확인한다.
2 row versioning, RCSI, gap lock 관련 옵션을 확인한다.
3 실패 코드와 재시도 횟수, backoff 정책을 정한다.
요약

같은 격리 수준 이름은 출발점일 뿐입니다. 동시성 품질은 일반 읽기, 잠금 읽기, 범위 보호, 충돌 실패를 제품별로 확인한 뒤 애플리케이션 재시도와 제약 설계까지 연결할 때 안정됩니다.