Backend/Spring+Boot

Spring Transaction 전파규칙

findmypiece 2021. 12. 15. 00:45
728x90

Spring에서는 Transaction이 걸려있는 메소드에서 Transaction 걸려있는 또 다른 메소드를 호출할 때 Transaction이 어떻게 전파될 것인지 결정할 수 있다.

 

다만 이것은 같은 클래스의 메소드끼리는 해당이 없다. 같은 클래스 내의 메소드 호출시에는 Transaction이 걸려있더라도 그냥 최초 호출한 시점에 시작된 Transaction만으로 진행된다.

@Transactional

기본속성이다. 기존에 생성된 Transaction이 있으면 참여하고 없다면 새로운 Transaction을 생성한다.
이는 결국 @Transactional(propagation = Propagation.REQUIRED) 를 의미한다.

@Transactional(propagation = Propagation.REQUIRES_NEW)

항상 새로운 Transaction을 생성한다.

 

@Transactional(propagation = Propagation.SUPPORTS)

기존에 생성된 중인 Transaction 이 있을 때만 참여하고 없다면 Transaction 없이 진행한다.

 

@Transactional(propagation = Propagation.NOT_SUPPORTED)

기존에 생성된 Transaction 이 있든 말든 Transaction 없이 진행한다.

 

@Transactional(propagation = Propagation.MANDATORY)

이미 진행 중인 Transaction이 있으면 참여한다. 반면에 기존에 생성된 Transaction 이 없다면 예외를 발생시킨다.

※ 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.

 

@Transactional(propagation = Propagation.NESTED)

이미 진행 중인 Transaction이 있다면 중첩으로 Transaction이을 생성해서 진행한다. 중첩된 Transaction은 먼저 시작된 부모 Transaction의 commit과 rollback에는 영향을 받지만 자신의 commit과 rollback은 부모 Transaction에 영향을 주지 않는다.

 

@Transactional(propagation = Propagation.NEVER)

Transaction 없이 진행한다. 이미 진행 중인 Transaction이 있으면 예외를 발생시킨다.

728x90