스물두줄

정보관리기술사 · 데이터베이스

트랜잭션 격리 수준

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션이 서로 간섭하는 정도를 정하는 기준이다. 격리 수준은 동시성과 데이터 일관성 사이의 트레이드오프를 결정한다. SQL 표준은 격리 수준을 네 단계로 나누고 단계마다 막는 이상 현상을 정한다. 단계가 올라갈수록 막는 이상 현…

주요 장면

  1. 0:02 1. 정의
  2. 0:16 2. 격리 수준별 이상 현상
  3. 0:35 3. 계좌 잔액 조회 예시
  4. 1:00 4. 헷갈리는 점
  5. 1:28 5. 직접 풀기
  6. 1:56 6. 정리

대본

1. 정의

트랜잭션 격리 수준은 동시에 실행되는 트랜잭션이 서로 간섭하는 정도를 정하는 기준이다.

격리 수준은 동시성과 데이터 일관성 사이의 트레이드오프를 결정한다.

2. 격리 수준별 이상 현상

SQL 표준은 격리 수준을 네 단계로 나누고 단계마다 막는 이상 현상을 정한다.

단계가 올라갈수록 막는 이상 현상이 늘어난다. 대신 동시성은 떨어진다.

READ COMMITTED는 Dirty Read만 막고 나머지 두 이상 현상은 허용한다.

3. 계좌 잔액 조회 예시

은행 계좌 잔액 조회 사례를 본다. 트랜잭션 A가 잔액 50,000원을 먼저 읽는다.

그 사이 트랜잭션 B가 5,000원을 입금하고 커밋한다.

READ COMMITTED에서는 A의 두 번째 조회 값이 바뀔 수 있다. 이것이 Non-repeatable Read다.

REPEATABLE READ에서는 A가 처음 읽은 스냅숏을 계속 보므로 값이 같다.

4. 헷갈리는 점

시험에서 자주 틀리는 지점이 세 가지 있다.

첫째, REPEATABLE READ가 팬텀을 막는지는 제품 구현에 따라 다르다. 표준상 팬텀은 발생할 수 있다.

둘째, MySQL InnoDB는 REPEATABLE READ에서 팬텀을 막는 것으로 알려져 있다.

셋째, Lost Update는 격리 수준만으로 막히지 않는다. 비관적 또는 낙관적 잠금이 필요하다.

5. 직접 풀기

방금 본 계좌 사례를 적용해 보자.

같은 트랜잭션에서 값이 바뀌는 현상을 막으려면 최소 어느 격리 수준이 필요한가?

6. 정리

정리한다. 격리 수준이 높을수록 이상 현상은 줄고 동시성과 성능은 떨어진다.

구현은 잠금 방식 또는 MVCC 방식이다. MVCC는 스냅숏으로 읽기와 쓰기가 서로 막지 않게 한다.

앞의 직접 풀기 정답은 REPEATABLE READ다. 같은 행을 다시 읽어도 값이 같게 보장된다.

시험에서는 네 단계와 이상 현상의 대응을 표로 정리해 두는 것이 좋다.

같은 장의 영상