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