트랜잭션의 REQUIRES_NEW 옵션을 사용한다.
별도의 물리 트랜잭션을 가진다는 뜻은 DB 커넥션을 따로 사용한다는 뜻이다.
@Test
void inner_rollback_requires_new() {
log.info("외부 트랜잭션 시작");
TransactionStatus outer = txManager.getTransaction(new DefaultTransactionDefinition());
log.info("outer.isNewTransaction = {}", outer.isNewTransaction());
log.info("내부 트랜잭션 시작");
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
TransactionStatus inner = txManager.getTransaction(definition);
log.info("inner.isNewTransaction = {}", inner.isNewTransaction());
log.info("내부 트랜잭션 롤백");
txManager.rollback(inner);
log.info("외부 트랜잭션 커밋");
txManager.commit(outer);
}
Transaction 전파 수준을 Requires_new 로 설정하면 내부 트랜잭션 시작시 새로운 커넥션을 얻어 사용한다. (기존 값일 때에는 외부 트랜잭션에 참여했었다.)
내부 트랜잭션이 시작될때 외부 트랜잭션이 잠시 보류되고 내부 트랜잭션이 완료되어 커넥션이 종료되거나 커넥션 풀에 반납되었을 때 외부 트랜잭션이 다시 시작된다.
-> 이 상황은 쓰레드 하나가 커넥션을 2개 쓴다는 의미로 상황에 맞게 써야한다.
트랜잭션 전파 옵션
isolateion
, timeout
, readOnly
는 트랜잭션이 처음 시작될 때만 적용된다.