Database/Mysql

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

noahkim_ 2024. 8. 10. 17:44

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

 

4. 격리 수준

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

 

종류

격리 수준 설명 허용되는 현상 성능 일관성
READ UNCOMMITTED 커밋되지 않은 데이터도 읽기 가능 Dirty Read 매우 높음 매우 낮음
READ COMMITTED 커밋된 데이터만 읽기 가능.
동일 쿼리 결과가 다를 수 있음
Non-Repeatable Read
Phantom Read
높음 중간
REPEATABLE READ
(InnoDB 기본값)
트랜잭션 내에서는 항상 동일한 데이터 읽음 Phantom Read
(InnoDB는 방지)
(갭 락 + 넥스트 키 락 사용)
보통 높음
SERIALIZABLE 모든 트랜잭션을 순차적으로 실행하는 것처럼 동작 없음 낮음 매우 높음

 

이상 현상

더보기

Dirty Read

Transaction A: (id = 1) member 테이블 행 읽음               10
Transaction B: (id = 1) member 테이블 행 컬럼 수정 (커밋 안함)  10 -> 20
Transaction A: (id = 1) member 테이블 행 읽음               20

=> 두번째 조회에서는 첫번째 조회와 다른 값이 반환됨 (커밋 안한 값을 읽음)
  • 다른 트랜잭션에서 커밋되지 않은 트랜잭션 내용 읽기 가능

 

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

=> 두번째 조회에서는 첫 번째 조회와 다른 데이터 수가 반환됨 (데이터 삭제됨)
  • 트랜잭션 내 동일한 데이터에 대해 결과 건수가 다른 상황