트랜잭션은 ACID를 보장해야 한다.
Atomicity, Consistency, Isolation, Durability
이들 중에 이번에는 격리성에 대해서 알아보자
격리성
동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다.
예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다.
격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다.
격리 수준
- Read uncommitted : 커밋되지 않은 읽기
- Read Commited : 커밋된 읽기
- Repeatable Read : 반복 가능한 읽기
- Serializable : 직렬화 가능
Read Uncommited의 격리 수준이 가장 낮고 Serializable의 격리 수준이 가장 높다.
격리 수준에 따른 문제점
- Dirty Read
- Non-Repeatable Read(반복 불가능한 읽기)
- Phantom Read
Read Uncommited
커밋되지 않은 데이터를 읽을 수 있다(Dirty Read)
읽은 데이터가 만약 롤백이 된다면? 정합성에 심각한 문제가 발생할 수 있다.
Read committed
커밋한 데이터만 읽을 수 있다.
하지만, 트랜잭션 1에서 데이터를 읽고 작업을 하는 중간에 트랜잭션 2에서 데이터를 수정하고 커밋한다면
트랜잭션 1에서 다시 데이터를 읽었을 때 수정된 데이터가 조회된다.
이처럼 반복해서 같은 데이터를 읽을 수 없는 상태를 Non-Repeatable Read(반복 불가능한 읽기)라 한다.
Repeatable Read
한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다.
하지만, 트랜잭션 1이 10살 이하의 회원을 조회했을 때 트랜잭션 2가 5살 회원을 추가하고 커밋하면
트랜잭션 1이 다시 10살 이하의 회원을 조회했을 때 결과 집합이 달라진다.
이처럼 반복 조회 시 결과 집합이 달라지는 것을 Phantom Read라 한다.
Serializable
가정 엄격한 격리 수준으로 위의 문제들이 발생하지 않는다.
다만 동시성 처리 성능이 급격히 떨어질 수 있다.
DB 벤더별로 default isolation level이 다르지만
mysql, postgreSQL.. READ_COMMITTED 기본 값이라고 한다.