트랜잭션(Transaction)
트랜잭션은 ACID 을 보장해야 한다. ACID란?
원자성(Atomicity)
- 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다.
일관성(Consistency)
- 모든 트랜잭션은 일관성있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
격리성(Isolation)
- 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치치 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다.
지속성(Durabillity)
- 트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.
격리성과 동시성의 상관관계
- 격리 수준이 낮을 수록 동시성은 증가되고, 격리 수준이 높을 수록 동시성은 낮아진다.
동시성이란
- 여러 요청들을 하나의 모듈이 처리 할 수 있는 능력을 말한다.
- 하나의 모듈이 여러 작업을 하는 것처럼 보이는 능력
트랜잭션의 격리 수준
순서대로 READ UNCOMMITED의 격리 수준이 가장 낮고 SERIALIZABLE의 격리 수준이 가장 높다.
- READ UNCOMMITTED (커밋되지 않은 읽기)
커밋하지 않은 데이터를 읽을 수 있다.
결국 다른 트랜잭션이 수정하는 내용을 읽을 수 있다.
DIRTY READ 문제점이 발생한다.
NON-REPEATABLE READ 문제점이 발생한다.
PHANTOM READ 문제점이 발생한다.
- READ COMMITTED (커밋된 읽기)
커밋된 데이터를 읽을 수 있다.
하지만 반복된 읽기를 하지 않는다. 다시 조회해야만 변경된 내용을 읽을 수 있다.
NON-REPEATABLE READ 문제점이 발생한다.
PHANTOM READ 문제점이 발생한다.
- REPEATABLE READ (반복 가능한 읽기)
반복된 조회를 한다.
하지만 반복된 조회로 결과가 달라진다.
PHANTOM READ 문제점이 발생한다.
- SERIALIZABLE (직렬화 기능)
트랜잭션의 격리 수준에 따른 문제점
- DIRTY READ (더러운 읽기)
커밋되지 않은 데이터를 읽을 수 있는 문제점
- NON-REPEATABLE READ (반복 불가능한 읽기)
데이터를 읽은 이후 또는 다른 트랜잭션이 변경 한 내용을 반복하여 읽지 않는 문제점
- PHANTOM READ (유령 읽기)
반복 조회 시 결과 집합이 달라지는 문제점
격리 수준의 문제점 표
격리수준 | DIRTY READ | NON-REPEATABLE READ | PHANTOM READ |
---|
READ UNCOMMITTED | 허용 | 허용 | 허용 |
READ COMMITTED | - | 허용 | 허용 |
REPEATABLE READ | - | - | 허용 |
SERIALIZABLE | - | - | - |
출처 자바 ORM 표준 JPA 프로그래밍 - 김영한님