Database/Mysql

[Real MySQL] 5-2. 트랜잭션과 잠금: 격리 수준

noahkim_ 2024. 8. 10. 17:44

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

4. 격리 수준

여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 얼마나 독립적으로 실행될 수 있는지 정의
  • 다른 트랜잭션의 중간 결과에 얼마나 영향을 안받을 지
  • 다른 트랜잭션에서 변경한 데이터를 얼마나 볼 수 있게 허용할지
  • 뒤로갈수록 고립도는 높아지고, 동시성과 성능은 떨어집니다.

 

READ UNCOMMITTED

  • 동시성 & 성능 높음
  • 데이터 일관성  & 정합성 보장 X
    • Dirty Read 허용
  • 일반적인 DBMS에서 사용 X

 

Dirty Read
  • 다른 트랜잭션에서 커밋되지 않은 트랜잭션 내용 읽기 가능

 

READ COMMITTED

  • 다른 트랜잭션에서 커밋된 트랜잭션 내용만 읽기 가능
  • 균형 좋음 (동시성 & 성능 - 데이터 일관성 & 정합성)
  • 데이터 일관성 문제 존재 (NON-REPEATABLE READ, Panthom Read)

 

NON-REPEATABLE READ
  • 트랜잭션 내 동일한 데이터에 대해 조회 결과가 다른 상황
Transaction A: (id = 1) member 테이블 행 읽음            10
Transaction B: (id = 1) member 테이블 행 컬럼 수정 + 커밋  10 -> 20
Transaction A: (id = 1) member 테이블 행 읽음            20

=> 두번째 조회에서는 첫번째 조회와 다른 값이 반환됨

 

Phantom Read
  • 트랜잭션 내 동일한 데이터에 대해 결과 건수가 다른 상황
Transaction A: (id = 1) member 테이블 행 읽음                  1, 2, 3, 4
Transaction B: (id = 1) member 테이블 행 삭제 or 추가 + 커밋     1, 2, 3 (4 삭제)
Transaction A: (id = 1) member 테이블 행 읽음                  1, 2, 3

=> 두번째 조회에서는 첫 번째 조회와 다른 데이터 수가 반환됨 (데이터 삭제됨)

 

REPEATABLE READ

  • 다른 트랜잭션에서 커밋된 트랜잭션 내용만 읽기
  • 해당 트랜잭션에서 모든 데이터 동일하게 유지됨
  • 기본 격리 수준 (InnoDB)

 

Panthom Read 문제 방지
  • InnoDB에서는 갭락과 넥스트 키 락을 사용하여 Panthom Read를 방지함
  • 범위 내에서 다른 트랜잭션이 데이터 수정이나 삽입을 못하도록 함

 

SERIALIZABLE

  • 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서 절대 접근 불가
  • 데이터 일관성 문제 X
  • 동시성 & 성능 낮음