스프링 트랜잭션 Propagation 테스트

Created:

짚고가기

선언한 @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