MySQL의 격리 수준

@lim · September 20, 2024

트랜잭션의 격리 수준

격리성(isolation)은 트랜잭션 수행 시 서로 간섭하지 않도록 보장하는 특성을 말한다.
이러한 격리성은 여러 개의 격리 주순으로 나뉘게 된다.

격리 수준(isolation level)이란 여러 트랜잭션이 동시에 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다.

ANSI/ISO 표준 SQL-92에서는 격리 수준은 4가지로 정의한다.

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

격리성이 강하면 동시성이 약해져서 (동시) 처리 속도가 낮아지고
격리성이 약해지면 동시성이 강해져서 처리 속도가 높아진다.

MySQL 서버에서는 SERIALIZABLE 가 아니라면 크게 성능 저하가 발생하지 않는다고 한다.

격리성과 동시성
격리성과 동시성

DIRTY READ가 발생하는 READ UNCOMMITTED는 일반적으로 사용되지 않고
또한 동시성이 중요한 데이터베이스에서는 SERIALIZABLE를 사용하지 않는다.

격리 수준에 따라 발생하는 현상

격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
(InnoDB는 ❌)
SERIALIZABLE

  • PHANTOM READ

한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우를 말한다.

  • NON-REPEATABLE READ (반복 가능하지 않은 조회)

다른 트랜잭션이 커밋한 데이터를 읽을 수 있는 것
한 트랜잭션 내의 같은 행에 두 번 이상 조회를 했을 때 값이 다른 경우를 말한다.
팬텀 리드는 조회시 다른 행이 선택될 수도 있다는 점에서 차이가 있다.

  • DIRTY READ

아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽을 수 있을 경우를 말한다.

MySQL에서는

REPEATABLE READ 에서는 PHANTOM READ 가 발생할 수 있으나 InnoDB에서는 발생하지 않는다.
일반적인 서비스에서는 READ COMMITTEDREPEATABLE READ를 주로 사용한다.
오라클에서는 READ COMMITTED를 MySQL에서는 REPEATABLE READ를 주로 사용한다.

격리 수준

SERIALIZABLE (Level 3)

트랜잭션을 순차적으로 실행한다. 가장 단순한 격리 수준이면서 엄격한 격리 수준이다.
여러 트랜잭션이 동시에 같은 행에 접근할 수 없다.
데드락 발생 확률이 높고 동시 처리 성능이 떨어질 수 있다.

REPEATABLE READ (Level 2)

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없도록 하지만, 새로운 행을 추가하는걸 막지는 않는다.
이후 추가된 행이 발견될 수도 있다.

READ COMMITTED (Level 1)

가장 많이 사용되는 격리수준. MySQL InnoDB, PostgreSQL, SQL Server, Oracle 기본값
커밋이 된 데이터만 조회할 수 있어, 다른 트랜잭션이 커밋하지 않은 정보는 조회할 수 없다.

READ UNCOMMITTED (Level 0)

가장 낮은 격리 수준. 성능은 빠르지만, 하나의 트랜잭션이 커밋되기 전에 다른 트랜잭션에서 조회할 수 있는 문제가 있다.
데이터 무결성(정합성)을 위해 사용하지 않는 편이 좋으나 어림잡아 집계한다면 사용할 수도 있다. (ex. 조회수)

isolation animation

https://www.mydbops.com/blog/back-to-basics-isolation-levels-in-mysql/

Spring에서는

@Transactional 어노테이션을 통해 격리 수준을 설정할 수 있다.

@Transactional(isolation = Isolation.READ_COMMITTED)
  • Isolation.READ_UNCOMMITTED
  • Isolation.READ_COMMITTED
  • Isolation.REPEATABLE_READ
  • Isolation.SERIALIZABLE

참고 내용

  • Real MySQL 8.0 1권 (백은빈, 이성욱)
  • 면접을 위한 CS 전공지식 노트 (주홍철)
@lim
기억은 기록기록