1. Transaction
트랜잭션의 특성은 다음과 같다.
- Atomic - Each unit of work is an all-or-nothing operation
- Consistent - Database integrity constraints are never violated
- Isolated - Isolating transactions from each other
- Durable - Committed changes are permanent
트랜잭션에는 로컬 트랜잭션과 글로벌 트랜잭션이 있다.
- 로컬 트랜잭션 (Single Resource) : Transactions managed by underlying resource
- 글로벌 (distributed) 트랜잭션 (Multiple Resources) : Transaction managed by separate, dedicated transaction manager
트랜잭션 코드 스타일 예.
try { beginTransaction … commitTransaction } catch (Exception e) { rollbackTransaction }
2. Propagation
Propagation이 뭘까? propagation은 전파옵션이라고 한다고 한다. Spring Transaction 선언 시 propagation mode를 설정할 수 있다고 한다.
Transaction Propagation 에는 아래와 같이 7가지가 있다.
REQUIRED, REQUIRESNEW, MADATORY, NOTSUPPORTED, SUPPORTS, NEVER, NESTED
Propagation을 설정하지 않으면 default 값은 REQUIRED 이다.
3. Propagation mode 7가지를 좀 더 살펴 볼까?
- REQUIRED : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다. 따라서 기존 트랜잭션과 통합하려면 REQUIRED를 사용해야 한다.
- REQUIRES_NEW : 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성되도록 한다.
- SUPPORT : 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 nontransactionally로 실행된다.
- MANDATORY : 부모 트랜잭션 내에서 실행되며 부모 트랜잭션이 없을 경우 예외가 발생된다.
- NOT_SUPPORT : nontransactionally로 실행하며 부모 트랜잭션 내에서 실행될 경우 일시 정지 된다.
- NEVER : nontransactionally로 실행되며 부모 트랜잭션이 존재한다면 예외가 발생한다.
- NESTED : 해당 메서드가 부모 트랜잭션에서 진행될 경우 별개로 커밋되거나 롤백될 수 있다. 둘러싼 트랜잭션이 없을 경우 REQUIRED와 동일하게 작동한다.
4. 가장 많이 쓰는 건?
REQUIRES_NEW 와 REQUIRED이다. 이 둘의 차이점을 보면?
REQUIRED : 실행 중인 Transaction context 가 있으면 해당 Transaction 내에서 실행하고, 없으면 새로운 Transaction 생성 REQUIRES_NEW : 기존에 실행 중인 Transaction 유무와 상관 없이 무조건 새로운 Transaction 생성