1. Transaction

트랜잭션의 특성은 다음과 같다.

  1. Atomic - Each unit of work is an all-or-nothing operation
  2. Consistent - Database integrity constraints are never violated
  3. Isolated - Isolating transactions from each other
  4. Durable - Committed changes are permanent

트랜잭션에는 로컬 트랜잭션과 글로벌 트랜잭션이 있다.

  1. 로컬 트랜잭션 (Single Resource) : Transactions managed by underlying resource
  2. 글로벌 (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 생성