DataBase/MySQL

Real MySQL 격리수준(Isolation Level)

레알윙 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도 발생되지 않는다.

 

 

 

 

 

 

 

 

참고

Real MySQL 8.0.1

 

반응형