본문 바로가기

Spring

스프링 트랜잭션 전파 속성(Transaction Propagation in Spring)

Spring Framework의 트랜잭션 전파속성

트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다. 트랜잭션 경계의 시작지점에서 트랜잭션 전파 속성을 참조해서, 해당 범위의 트랜잭션을 어떤 식으로 진행 시킬 지 결정 할 수 있다.

스프링이 지원하는 트랜잭션 전파속성은 여섯가지가 있다. 모든 속성이 트랜잭션 매니저, 데이터 액세스 기술과 지원되지는 않으니 주의해야 한다.

  • Required (default)
  • Supports
  • Mandatory
  • Requires new
  • Not supported
  • Never
  • Nested

Required

기본 속성. 모든 트랜잭션 매니저가 지원한다. 미리 시작 된 트랜잭션이 있으면 참여하고, 없으면 새로 시작한다.

트랜잭션이 시작 된 후에 다른 트랜잭션 경계가 설정된 메소드를 호출하면 같은 트랜잭션으로 묶인다.

// REQUIRED
@Transactional
A(){
	B()
}

@Transactional(propagation=Propagation.REQUIRED)
B(){
}

 

  • A && B 성공 : A, B 성공
  • A || B 실패 : A, B 실패

Supports

이미 시작된 트랜잭션이 있으면 참여하고, 그렇지 않으면 트랜잭션 없이 진행한다.

Mandatory

이미 시작된 트랜잭션이 있으면 참여한다. 시작된 트랜잭션이 없으면 예외를 발생 시킨다. 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용한다.

// MANDATORY
@Transactional
A(){
	B()
}

A-2(){
	B()
}

@Transactional(propagation=Propagation.MANDATORY)
B(){
}

 

  • A : 정상 동작(Required와 동일)
  • A-2 : 예외 발생

Requires new

항상 새로운 트랜잭션을 시작한다. 이미 진행중인 트랜잭션은 잠시 보류시키고 새로운 트랜잭션을 시작한다. 이전 트랜잭션과 다음 트랜잭션은 별도로 동작한다.

// REQUIRES_NEW
@Transactional
A(){
	B()
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
B(){
}
  • A && B 성공 : A, B 성공
  • A 성공, B 실패 : A 성공, B 실패
  • A 실패, B 성공 : A 실패, B 성공

Not supported

트랜잭션을 사용하지 않는다. 이미 진행중인 트랜잭션이 있으면 보류시킨다.

Never

트랜잭션을 사용하지 않도록 강제한다. 이미 트랜잭션이 진행중이면, 예외를 발생시킨다.

// NEVER
@Transactional
A(){
	B()
}

A-2(){
	B()
}

@Transactional(propagation=Propagation.NEVER)
B(){
}
  • A : 예외 발생
  • A-2 : 정상 동작

Nested

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

상위 트랜잭션은 하위 트랜잭션에 영향을 주지만, 하위 트랜잭션의 결과는 상위 트랜잭션의 결과에 영향을 끼치지 않는다.

// NESTED
@Transactional
A(){
	B()
}

@Transactional(propagation=Propagation.NESTED)
B(){
}
  • A && B 성공 : A, B 성공
  • A 성공, B 실패 : A 성공, B 실패
  • A 실패, B 성공 : A 실패, B 실패

 

참조

 

[Spring 3 - Transaction] 트랜잭션 속성

모든 트랜잭션이 같은 방식으로 동작하는 건 아니다. 전체가 같이 실패하거나 성공하는 하나의 작업으로 묶인다는 점에서는 다를바 없겠지만, 세밀히 따져보면 몇 가지 차이점이 있다. 스프링

springsource.tistory.com

 

'Spring' 카테고리의 다른 글

컨테이너와 IoC, DI 란?  (0) 2021.02.17