Database Isolation

한 문장 정의

Database isolation은 동시에 실행되는 transaction이 서로의 중간 상태와 재조회 결과를 어디까지 볼 수 있는지 정하는 consistency boundary다.

Spring Transaction이 하나의 작업을 commit 또는 rollback 단위로 묶는다면, isolation은 그 경계 안에서 여러 transaction 사이의 visibility를 정한다. Propagation이 "nested call이 transaction을 공유할지"를 결정하는 것과 달리, isolation은 "concurrent read/write anomaly를 어느 수준까지 허용할지"를 결정한다.

동시성이 만드는 읽기 이상 현상

sequenceDiagram
    participant T1 as Transaction 1
    participant DB as Database
    participant T2 as Transaction 2
    T1->>DB: 범위 또는 row 조회
    T2->>DB: update, insert, commit
    T1->>DB: 같은 조회 재실행
    DB-->>T1: isolation level에 따른 visibility

격리 수준 선택지

선택 기준

이 순서로 좁혀 가는 편이 실용적이라고 판단한다 — source가 표를 제공할 뿐 선택 절차 자체를 제시하지는 않으므로, 아래는 이 페이지의 해석이다.

적용 범위와 불확실성

표준 isolation 이름이 같아도 lock, MVCC snapshot, phantom 처리 방식은 DBMS와 설정에 따라 다르다. 이 페이지는 개념 선택 기준이며 특정 DBMS의 구현 보장이 아니다.

관련

출처

테스트 질문


  1. Transaction.md — "Dirty Read: 다른 트랜잭션이 커밋하지 않은 변경 단계의 데이터를 읽어 발생하는 일시적 왜곡 현상.", "Non-Repeatable Read: 한 트랜잭션 안에서 같은 데이터를 두 번 조회할 때, 중간에 다른 트랜잭션이 값을 수정/커밋하여 두 조회 값이 다르게 나타나는 현상.", "Phantom Read: 한 트랜잭션 안에서 범위 쿼리를 두 번 조회할 때, 중간에 다른 트랜잭션이 데이터를 삽입/삭제하여 결과 행(Row) 수가 달라지는 현상." ↩︎ ↩︎ ↩︎ ↩︎

  2. Transaction.md — 격리 수준 표: "READ_UNCOMMITTED... 데이터 부정확성이 매우 높아 실무 미사용.", "READ_COMMITTED... Oracle, PostgreSQL 등 다수 RDBMS의 기본값.", "REPEATABLE_READ... MySQL(InnoDB)의 기본값.", "SERIALIZABLE... 성능 저하가 심해 특수한 금융 거래 등 외에는 거의 미사용." ↩︎ ↩︎

  3. 인증 실패 응답·좋아요 중복 방지 노트 — "트랜잭션이 보장하는 것은 "내 작업이 다 되거나 다 안 되거나"다. "다른 요청이 사이에 끼어들지 못하게"는 보장하지 않는다.", "기본 격리 수준(READ COMMITTED)에서 일반 SELECT는 커밋된 데이터만 본다. 그래서 둘 다 "없음"을 본다.", "일반 조회와 달리 유니크 인덱스는 커밋 안 된 행까지 안다." ↩︎ ↩︎