본문 바로가기
JAVA

[Spring] 트랜잭션 전파 속성 (Transaction Propagation)

by HANdeveloper 2022. 9. 23.

- 비지니스 로직하나와 트랙잭션 하나가 거의 1:1 로 이루어짐

- 서비스 메소드가 호출 → 트랜잭션 시작

- 서비스마치고 컨트롤러 되돌아갈 때 → 트랜잭션 종료(모든 작업확정하는 커밋/모든 작업을 무효화하는 롤백)

 

트랜잭션 전파속성 Transaction Propagation 이란?

Spring 이 제공하는 선언적 트랜잭션(@Transaction)의 장점 중 하나는 여러 트랜잭션을 묶어서 커다란 하나의 트랜잭션 경계를 만들수 있다는 점이다. 작업을 하다보면 기존에 트랜잭션이 진행중 일 때 추가적인 트랜잭션을 진행해야 하는 경우가 있다. 이미 트랜잭션이 진행중 일 때 추가 트랜잭션 진행을 어떻게 할지 결정하는 것이 전파속성이다.

전파속성에 따라 기존의 트랜잭션에 참여할 수도 있고 별도의 트랜잭션으로 진행할 수도 있고, 에러를 발생시키는 등 여러 선택을 할 수 있다.

즉, 2개이상의 트랜잭션이 작동할 때, 기존의 트랜잭션에 적용되는 방법을 설정

 

트랜잭션 설정파일

xml파일에 transactionManager 빈을 추가

DataSourceTransactionManager 는 Connection의 트랜잭션 API를 이용해서 트랜잭션을 관리해주는 매니저이고

JDBC API를 이용하여 트랜잭션을 관리하는 데이터액세스 기술인 JDBC와 Mybatis에 적용 가능하다.

 

  • Annotation을 이용한 트랜잭션

xml파일에 위 한줄을 추가해야한다!

 

사용할 때에는 트랜잭션을 적용할 클래스, 인터페이스, 메소드에 @Transactional 어노테이션을 선언

 

트랜잭션 전파 속성

7가지 전파속성이 존재하는데 REQUIRED 와 REQUIRES_NEW 를 이해하면 나머지는 응용가능!

  • REQUIRED <=>  REQUIRES_NEW
  • SUPPORTS <=>  NOT_SUPPORTED
  • MANDATORY <=>  NEVER

 

  • REQUIRED

REQUIRED는 스프링이 제공하는 기본적인(DEFAULT) 전파 속성

미리 시작한 트랜잭션이 있으면 참여하고 아니면 새로 시작한다. => 한 트랜잭션이 시작된 후, 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스럽게 같은 트랜잭션으로 묶인다.

 

  • REQUIRES_NEW

각각 트랜잭션 처리(별도의 트랜잭션 처리) 

매번 새로운 트랜잭션 시작한다. 이미 진행중인 트랜잭션이 있으면 트랜잭션을 잠시 보류시킨다. 

 

  • SUPPORTS

기존 트랜잭션에 의존 => 이미 시작된 트랜잭션이 있고 없고에 따라 다르다

이미 시작된 트랜잭션이 있으면 참여하고 아니면 트랜잭션 없이 진행한다.

 

  • NOT_SUPPORTED

트랜잭션에 포함하지 않음(트랜잭션이 없는것과 동일)

트랜잭션을 사용하지 않게 한다. 이미 진행중인 트랜잭션은 보류시키며 트랜잭션 유무와 관계없이 사용하지 않는다.

 

  • MANDATORY

트랜잭션에 꼭 포함되어야함 (트랜잭션이 있는 곳에서 호출해야됨)

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

반면에 트랜잭션 시작된 것이 없으면 예외를 발생시킨다. 혼자서는 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용

 

  • NEVER

트랜잭션에 절대 포함시키지 않음, 트랜잭션이 있는 곳에서 호출하면 에러발생

트랜잭션을 사용하지 않도록 강제화하는 것이다. 이미 진행중인 트랜잭션도 존재하면 안된다. 있다면 예외를 발생시킨다.

 

  • NESTED

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

중첩트랜잭션은 트랜잭션 안에 다시 트랜잭션을 만든다.

 

 

 

댓글