트랜잭션
- 트랜잭션은 기본적으로 ACID중 원자성, 일관성, 지속성은 만족한다. 여기서 다루기 피곤한 녀석이 격리성이다. 단순히 트랜잭션 간에 간섭이 없도록 격리성을 분리해버리면 테이블 접근이 제한적이기때문에 동시성 처리 성능이 떨어지게된다.
Isolation Level 정의
트랜잭션들 끼리 일관된 데이터를 얼마나 허용할 것인지를 정하는 수준이다.
종류
총 4가지의 단계가 존재한다. 고립 수준(레벨)이 높아질수록 동시성은 낮아지며, 일관성은 높아진다. 즉, 고립이 심해질수록 동시 접근성은 떨어지지만, 데이터가 일관되게 관리됨을 의미한다.
Level 0 Read Uncommitted
- Transaction A가 수행되는 와중에 Transaction B가 데이터를 변경할 수 있다.
- 이럴때 A는 변경되기 전의 데이터를 읽을 가능성이 있다. 이를 Dirty Read라고 한다.
- 동시성은 높으나 일관성이 떨어짐, 가능하면 사용하지 말것
- 발생가능한 이상현상 : Dirty Read, Non Repeatable Read, Phantom Read
Level 1 Read Committed
- 트랜잭션이 작업하는 시점에 Lock을 건다.
- 트랜잭션1이 회원A를 조회중일때, 트랜잭션2가 회원A 정보를 수정하고 커밋을 하면 트랜잭션 1이 다시 회원 A를 조회했을때 수정된 데이터가 조회된다. 하나의 트랜잭션에서 같은 회원A 정보를 얻지 못하는 현상이 발생하게된다. 이를 NON-REPEATABLE READ라 한다.
- 대부분의 DB의 고립레벨이다. (MySQL 제외)
- 발생가능한 이상현상 : Non Repeatable Read, Phantom Read
Level 2 Repeatable Read
- 트랜잭션 1이 10살 이하의 회원을 조회했는데 트랜잭션 2가 5살 회원을 추가하고 커밋하면 트랜잭션1이 다시 10살 이하의 회원을 조회했을 때 회원 하나가 추가된 상태로 조회된다. 이처럼 반복 조회시 결과 집합(개수)가 달라지는 것을 PHANTOM READ라고한다.
- MySQL의 고립레벨이다.
- 발생가능한 이상현상 : Phantom Read
Level 3 Serializable
- 데이터의 안정성이 매우 중요한 특수한 상황이 아닌 이상 거의 사용하지 않음
- 발생가능한 이상현상은 없다.