스프링 트랜잭션 Propagation 테스트
짚고가기
선언한 @Transactional
이 적용되려면 각 다른 Bean에서 호출되어야 했다. 같은 Bean 내에서 트랜잭션이 적용된 메소드를 호출하니 작동하지 않았다.
특정 메소드에서 어떤 트랜잭션이 적용되고 있는지 알고자 할 경우에는 TransactionSynchronizationManager.getCurrentTransactionName()
을 찍어보면 현재 트랜잭션명을 가져올 수 있다.
만약 @Transactional
자체를 선언하지 않았다면 메소드 내에서 예외가 발생하여도 롤백되지 않는다.
아래의 Propagation 옵션은 자식 트랜잭션에서 설정해준 것이다.
Propagation 옵션
REQUIRED
기본값이다.
부모 트랜잭션이 있다면 부모 트랜잭션을 따라간다.
부모 또는 자식 트랜잭션에서 예외가 발생할경우 둘다 롤백된다.
REQUIRES_NEW
부모 트랜잭션의 존재여부와 상관없이 새로 트랜잭션을 생성한다.
부모 트랜잭션 메소드에서 예외가 발생해도 자식 트랜잭션은 롤백되지 않는다.
SUPPORTS
부모 트랜잭션이 있다면 부모 트랜잭션을 따라간다.
부모 트랜잭션이 없다면 SUPPORTS로 선언된 자식 트랜잭션은 마치 @Transactional
이 선언되지 않은것처럼 예외가 발생하여도 롤백되지 않았다. non-transactionally
로 처리되어서 그런듯하다.
MANDATORY
부모 트랜잭션이 있다면 부모 트랜잭션을 따라간다.
부모 트랜잭션이 없다면 예외를 발생시킨다. No existing transaction found for transaction marked with propagation 'mandatory'
NOT_SUPPORTED
부모 트랜잭션의 존재여부와 상관없이 non-transactionally
로 처리되어 예외가 발생해도 롤백처리 되지 않는다.
NEVER
부모 트랜잭션이 존재하면 예외를 발생시킨다. Existing transaction found for transaction marked with propagation 'never'
부모 트랜잭션이 존재하지 않는다면 non-transactionally
로 처리되어 예외가 발생해도 롤백 처리 되지 않는다.
Comments