본문 바로가기
Web/Spring

[Spring] 트랜잭션 전파(Transactional Propagation)

by Geunny 2022. 7. 13.
반응형

스프링에서 '@Transactional' 어노테이션을 사용하게 되면 

클래스 또는 매서드 단위로 트랜잭션을 관리하게 해줄 수 있다.

 

이러한 방식을 스프링에서 선언적 트랜잭션 경계설정이라 말하고,

이러한 선언적 트랜젝션은 트랜랜잭션 전파기능을 제공한다.

 

여기서 트랜잭션 전파란 

서로 연결된 객체(서비스)사이에서 각각의 트랜잭션을 어떻게 전파시키는지 라고 말할수 있다.

 

트랜잭션 설정 방법에는 코드를 이용하여 경계를 설정하는 방법과

어노테이션을 이용하는 방법이 있는데

 

이글에서는 어노테이션을 이용한 방법을 이용하여

트랜잭션 전파에 대해 정리해보자 한다.

 

 

'@Transactional' 어노테이션의 속성으로 propagation 을 설정하는 기능이 존재한다.

 

propagation 속성값들로 다음 7가지가 존재한다.

 

1.REQUIRED

트랜잭션 기본 속성이다. 모든 트랜잭션 매니저가 지원한다.

트랜잭션이 있으면 참여하고 없으면 새로 시작한다.

 

2.SUPPORTS

이미 시작된 트랜잭션이 있다면 참여하고, 없다면 트랜잭션 없이 동작한다.

 

3.MANDATORY

REQUIRED와 비슷하게 이미 시작된 트랜잭션이 있으면 참여한다.

하지만 트랜잭션이 없다면 예외를 발생한다.

독립적으로 사용되면 안되는 트랜잭션을 진행할 경우 사용하면 된다.

 

4.REQUIRES_NEW

항상 새로운 트랜잭션을 시작한다.

이미 진행중인 트랜잭션이 있다면 해당 트랜잭션은 잠시 보류시킨다.

 

5.NOT_SUPPORTED

트랜잭션을 사용하지 않게 하며, 이미 사용된 트랜잭션이 있다면 보류시킨다.

 

6,NEVER

트랜잭션을 사용하지 않도록 강제한다.

이미 사용된 트랜잭션이 있다면 예외를 발생시킨다.

 

7,NESTED

이미 진행중인 트랜잭션이 있다면 중첩 트랜잭션을 시작한다.

중첩된 트랜잭션은 부모 트랜잭션에 영향을 받지만

자식 트랜잭션의 커밋과 롤백은 부모 트랜잭션에 영향주지 않는다.

 

 

 

 

출처 : 토비의 스프링3.0

 

댓글