전파 속성(Propagation)
@Transactional(propagation=Propagation.NESTED)
- 트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황에 선택할 수 있는 옵션이다.
Spring
이 지원하는 전파 속성은 아래 7가지가 있다.
REQUIRED
, SUPPORTS
, MANDATORY
, REQUIRES_NEW
, NOT_SUPPORTED
, NEVER
, NESTED
🌱 스프링에서는 트랜잭션 처리를 지원하는데, 그 중 한 방법으로 @Transactional
어노테이션을 클래스 혹은 메서드 위에 추가할 수 있다.
이를 선언적 트랜잭션이라고 부른다.
REQUIRED (기본 값)
- 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로 시작한다.
- 하나의 트랜잭션이 시작된 후 다른 트랜잭션 경계가 설정된 메소드를 호출하면 같은 트랜잭션으로 묶인다.
SUPPORTS
- 이미 시작된 트랜잭션이 있으면 참여하고, 그렇지 않으면 트랜잭션 없이 진행한다.
- 트랜잭션이 없어도 해당 경계 안에서
Connection
객체나 하이버네이트의 Session
등은 공유 할 수 있다.
MANDATORY
- 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로 시작하는 대신 없으면 예외를 발생시킨다.
- 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용한다.
REQUIRES_NEW
- 이미 진행중인 트랜잭션이 있으면 이를 보류시키고 새로운 트랜잭션을 만들어 시작한다.
- 항상 새로운 트랜잭션을 시작해야 하는 경우에 사용한다.
NOT_SUPPORTED
- 이미 진행중인 트랜잭션이 있으면 이를 보류시키고, 트랜잭션을 사용하지 않도록 한다.
NEVER
- 이미 진행중인 트랜잭션이 있으면 예외를 발생시키며, 트랜잭션을 사용하지 않도록 강제한다.
NESTED
- 이미 진행중인 트랜잭션이 있으면 중첩(자식) 트랜잭션을 시작한다.
NESTED
에 의한 중첩 트랜잭션은 먼저 시작된 부모 트랜잭션의 커밋과 롤백에는 영향을 받지만, 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않음
출처
[DB / Spring ] @Transactional 세부 설정 - 격리 수준 / 전파 수준 설정
[Spring] Spring 트랜잭션의 세부 설정(전파 속성, 격리수준, 읽기전용, 롤백/커밋 예외 등) - (2/3)
트랜잭션과 Spring의 선언적 트랜잭션에 대하여