트랜잭션의 격리 수준
격리성(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 COMMITTED
와 REPEATABLE 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. 조회수)
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 전공지식 노트 (주홍철)