-
Real MySQL 격리수준(Isolation Level)DataBase/MySQL 2022. 5. 1. 15:38반응형
과거 정리한 내역이다. 해당 내역은 기본적인 이론만 작성했고, 이번에는 기본적인 내용과 깊은 내역까지 정리할 것이다.
2021.03.09 - [DataBase/공통] - DB 트랜잭션 격리수준(Isolation Level)
트랜잭션 격리수준에 따른 발생되는 문제
격리수준(Isolation Level) 설명
READ UNCOMMITTED
- Shared Lock이 걸리지 않는 상태이다.
- 해당 그림을 보게 된다면 사용자 A는 Lara라는 데이터를 Insert를 했고, 아직 commit상태가 아닌경우지만 사용자 B는 Lara라는 데이터를 읽을 수가 있다. 즉 coomit 상태가 아닌경우에도 데이터를 읽읅 수 있다.
- 사용자 A가 처리도중 알 수 없는 오류로 롤백한다고 하더라고 사용자 B는 Lara가 정상적인 상태라고 인식을 하고 계속 처리할 것이다.
READ COMMITTED
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸린 상태
- 하나의 트랜잭션에서 coomit하기 전에 UPDATE한 내역을 볼 수 있는 상태이다. 그렇기 때문에 SELECT의 결과값에 대한 동일성을 보장해 주지 못한다.
REPRETABLE READ
- 트랜잭션 내에서 Shared Lock이 걸린 상태
- 트랜잭션 내에서 동일한 값을 보장해 주지만 중간에 INSERT 데이터가 commit이 되었을 때 commit전과 후가 Read row의 갯수가 다르다.
- InnoDB 스토리지 엔진은 트랜잭션이 ROLL BACK 될 가능성을 대비하여 변경되기 전 레코드를 Undo 공간에 백업해두고 실제 레코드 값을 변경한다. 그렇기 때문에 조회(SELECT) 시 동일한 데이터를 보장해 준다.
- SELECT ... FOR UPDATE는 SELECT하는 레코드에 Lock을 걸어야 하는데 Undo 공간에는 잠금을 걸 수 없기 때문에 SELECT... FOR UPDATE나 SELECT ... LOCK IN MODE는 현재의 레코드의 값을 가져오기 때문에 바뀐 값을 가져올 수가 있다.
SERIALIZBLE
- 가장 단순한 격리 레벨이면서 동시에 가장 엄격한 격리 레벨이다. 그렇기 때문에 다른 트랜잭션 격리 레벨보다 동시 처리 성능도 매우 낮다.
- 하나의 트랜잭션내에서 읽고 쓰고 수정하는 동안 다른 트랜잭션내에서 접근을 할 수 없다. 그렇기 때문에 Phantom Read도 발생되지 않는다.
참고
반응형'DataBase > MySQL' 카테고리의 다른 글
MySQL Explain 보는 법 (0) 2022.07.31 Real MySQL 인덱스 (0) 2022.05.08 Real MySQL 트랜잭션 (0) 2022.04.30 Real MySQL 아키텍처 (0) 2022.03.12