본문 바로가기
DB/MySQL

[MySQL] 격리수준 (isolation level)

by yeonn108 2026. 1. 10.

여러 트랜잭션이 동시에 처리될 때, 하나의 트랜잭션이 다른 트랙잭션에서 조작한 데이터를 조회하는 걸 "어디까지 허용할 것인가" 하는 수준이다.

격리수준이 낮을수록 데이터 부정합이 발생하고 높을수록 동시성이 떨어진다.

 

Read uncommited

한 트랜잭션이 다른 트랜잭션에서 커밋하지도 않은 데이터 변경사항을 조회할 수 있다. (Dirty read)

 

Read commited

한 트랜잭션에서 동일 데이터를 두 번 조회하는 사이에 다른 트랜잭션이 해당 데이터를 변경한 것을 커밋하면 두 번의 조회 결과가 다를 수 있다. (Non-Repeatable read)

 

Repeatable read

InnoDB에서는 MVCC(Multi Version Concurrency Control)방식으로 변경 전 데이터를 언두로그에 백업하고 레코드를 업데이트한다.

언두로그에 있는 트랜잭션 ID를 기준으로 자신의 트랜잭션 ID보다 작은 걸로 조회하기 때문에 Repeatable read가 보장된다. 

 

일반적으로 다음의 경우에 해당 수준에서 Phantom Read(유령읽기)가 발생할 수 있다.

한 트랜잭션 내에서 select where id >= 10 와 같은 두 번의 데이터 조회를 할 때, 다른 트랜잭션에서의 id >= 10 범위에 insert가 발생한다면 Phantom Read가 발생할 수 있다. 하지만 MVCC 덕분에 이 경우에는 Phantom Read가 발생하지 않는다.

 

또 생각해 볼 것이 select for update 문과 같이 잠금을 획득해야하는 조회이다. 이때 언두레코드에 잠금을 걸 수 없기 때문에 현재 레코드를 조회하게 된다. 

두 번의 select for update where id >= 10 조회 사이에 id >= 10의 범위에 해당하는 데이터가 insert되면 두 번째 조회에서 언두레코드를 조회할 수 없기 때문에 Phantom Read가 발생할 수 있다.

그렇지만 InnoDB에는 Gap lock이 있기 때문에 id >= 10 범위에 insert 문이 대기하므로 Repeatable read 수준에서도 Phantom Read가 발생하지 않는다.

 

Serializable

읽기, 쓰기 작업 모두 잠금을 획득해야해서 한 트랜잭션에서 읽으면 다른 트랜잭션에서 읽지도, 쓰지도 못한다. 데이터 부정합은 없지만 동시성이 떨어진다. InnoDB에서는 Repeatable read 수준에서도 Phantom Read가 발생하지 않기 때문에 Serializable 수준은 웬만해선 필요하지 않을 것이다.

 

 

참고: Real MySQL 8.0

https://mangkyu.tistory.com/299

'DB > MySQL' 카테고리의 다른 글

[MySQL] Real MySQL 04 서버 아키텍처 (1)  (0) 2022.03.07