티스토리 뷰
목차
1. READ UNCOMMITTED
2. READ COMMITTED
3. REPEATABLE READ
4. SERIALIZABLE
MySQL의 격리 수준
트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.
1. READ UNCOMMITTED
각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 조회할 수 있다.
어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 Dirty read 가 허용된다.
2. READ COMMITTED
어떤 트랜잭션에서 데이터를 변경했더라도 COMMIT이 완료된 데이터만 다른 트랜잭션에서 조회할 수 있다.
● Dirty read 가 발생하지 않는다.
새로운 값인 "Toto" 는 테이블에 기록되고 이전 값인 "Lara"는 언두 영역으로 백업한다.
사용자 B의 조회 결과는 언두 영역에 백업된 레코드("Lara")가 반환된다.
● NON-REPEATABLE READ 라는 부정합 문제가 발생할 수 있다.
사용자 B가 하나의 트랜잭션 내에서 똑같은 SELECT 쿼리를 실행했을 때는 항상 같은 결과를 가져와야 한다는 REPEATABLE READ 에 어긋난다.
3. REPEATABLE READ
InnoDB 엔진의 기본 격리 수준이다.
MVCC 를 이용해 현재 트랜잭션의 ID보다 작은 ID로 변경된 데이터만 언두 로그에서 조회한다.
사용자 B가 10번으로 트랜잭션을 시작했는데, 그때부터 사용자 B의 10번 트랜잭션 안에서 실행되는 모든 SELECT 쿼리는 트랜잭션 번호가 10(자신의 트랜잭션 번호)보다 작은 트랜잭션 번호에서 변경한 것만 조회하게 된다.
● PHANTOM READ 가 발생할 수 있다.
다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상이다.
"SELECT ... FOR UPDATE", "SELECT ... FOR SHARE" 를 제외한 SELECT 에서는
InnoDB 스토리지 엔진에서 갭 락과 넥스트 키 락 덕분에 PHANTOM READ 가 발생하지 않는다.
SELECT ... FOR UPDATE 쿼리는 SELECT 하는 레코드에 쓰기 잠금을 걸어야 하는데, 언두 레코드에는 잠금을 걸 수 없어 변경 전이 아닌 현재의 레코드를 조회하게 된다.
4. SERIALIZABLE
읽기 작업도 공유잠금을 획득하기 때문에 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 접근할 수 없다.
(잠금 없는 일관된 읽기)
잠금 없는 일관된 읽기 (Non-Locking Consistent Read)
InnoDB 스토리지 엔진은 격리수준이 SERIALIZABLE이 아닌 경우 MVCC 기술을 이용해 다른 트랜잭션이 가지고 있는 잠금을 기다리지 않고 읽기 작업이 가능하다.
격리 수준이 1 > 4 로 갈수록 트랜잭션 간의 격리 정도가 높아지며, 동시 처리 성능은 떨어진다.
DIRTY READ | NON-REPEATABLE READ | PHANTOM READ | |
1. READ UNCOMMITTED | O | O | O |
2. READ COMMITTED | X | O | O |
3. REPEATABLE READ | X | X | O (InnoDB는 없음) |
4. SERIALIZABLE | X | X | X |
참고
'Database > MySQL' 카테고리의 다른 글
[MySQL] 통계 정보 (0) | 2023.06.02 |
---|---|
[MySQL] 인덱스 (0) | 2023.06.02 |
[MySQL] 옵티마이저의 데이터 처리 (0) | 2023.06.02 |
[MySQL] B-Tree 인덱스를 통한 데이터 읽기 (0) | 2023.05.22 |
- Total
- Today
- Yesterday
- 이벤트 스토밍
- MySQL
- Spring Data JPA
- TDD
- 마이크로서비스 패턴
- mockito
- named query
- 폴링 발행기 패턴
- spring rest docs
- JPA
- H2
- clean code
- Stream
- ATDD
- HTTP 헤더
- Spring
- kafka
- Git
- 트랜잭셔널 아웃박스 패턴
- 계층형 아키텍처
- Spring Boot
- 클린코드
- Ubiquitous Language
- 육각형 아키텍처
- http
- 스프링 카프카 컨슈머
- 학습 테스트
- 도메인 모델링
- 스프링 예외 추상화
- java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |