트랜잭션 격리수준(Isolation level)
트랜잭션은 원자성, 일관성, 격리성, 지속성을 보장해야 한다.
- 원자성: 트랜잭션 내에서 실행한 작업들은 모두 성공하거나 모두 실패해야 한다.
- 일관성: 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야한다.
- 격리성: 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 해야한다.
- 지속성: 트랜잭션이 성공적으로 끝나면 그 결과가 지속되어야 한다.
트랜잭션이 격리성을 보장하기 위해서는 순차실행을 해야하는데, 이럴 경우 처리 성능이 매우 낮아진다.
이런 제로 트랜잭션의 격리 수준을 4단계로 나누어 정의하고 상황에 맞는 레벨을 사용하도록 한다.
- READ UNCOMMITTED(커밋되지 않은 읽기)
- READ COMMITTED(커밋된 읽기)
- REPETABLE READ(반복 가능한 읽기)
- SERIALIZABLE(직렬화 가능)
순서대로 READ UNCOMMITTED의 격리 수준이 가장 낮고, SERIALIZABLE 격리 수준이 제일 높다.
READ UNCOMMITTED(커밋되지 않은 읽기)
커밋하지 않은 데이터를 읽을 수 있는 격리 레벨이다. 트랜잭션 A가 데이터를 수정하고 있는데, 커밋하지 않아도 트랜잭션 B가 수정중인 데이터를 조회 할 수 있고, 이를 DIRTY READ라고 한다. 위와 같은 상황에서 트랜잭션 A가 롤백 된다면 정합성에 문제가 발생할 있다.
READ COMMITTED(커밋된 읽기)
커밋한 데이터만 읽을수 있는 수준이다. DIRTY READ는 허용하지 않지만, NON-REPEATABLE READ가 발생 할 수 있다.
* NON-REPEATABLE READ : 트랜잭션 A가 회원a를 조회중인데, 갑자기 트랜잭션 B가 회원 a를 수정하고 커밋하면, 트랜잭션 A가 다시 회원 a를 조회했을때 수정된 데이터로 조회가 된다. 반복적으로 데이터를 읽을때 데이터가 달라질 수 있다.
REPETABLE READ(반복 가능한 읽기)
한번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회된다. NON-REPEATABLE READ는 허용하지 않지만, PHANTOM READ는 허용한다.
* PHANTOM READ: 반복해서 조회할 때 결과 집합이 달라지는 것을 말한다. 예들 들어 트랜잭션 A가 20살 이상 회원을 조회 했는데,
트랜잭션 B가 25살 회원을 추가하고 커밋하면, 트랜잭션 A가 다시 20살 이상 회원을 조회할때 한명의 회원이 추가된 상태로 조회된다.
SERIALIZABLE(직렬화 가능)
가장 엄격한 트랜잭션 격리수준이다. PHANTOM READ도 발생하지 않지만,
동시성 처리가 필요할때 성능이 급격히 떨어질 수 있다.
대부분의 애플리케이션의 경우 동시성 처리가 중요하므로 보통 READ COMMITTED 격리 수준을 기본으로 사용한다.
일부 중요한 비즈니스 로직에 더 높은 격리수준이 필요다하면 디비 트랜잭션이 제공하는 잠금기능을 사용하기도 한다.
참고) 자바 ORM 표준 JPA 프로그래밍[김영한 저]
'Web, Network, OS' 카테고리의 다른 글
| [네트워크] OSI 7 계층 각 계층별 역할 (0) | 2022.03.14 |
|---|---|
| 다양한 HTTP 상태코드 (0) | 2022.02.28 |
| [HTTP] HTTP Method 종류와 특징 (0) | 2022.02.25 |