개인적인 경험으로 propagation은 default인 REQUIRED와 REQUIRES_NEW를 가장 많이 사용하게 된다.
REQUIRED는 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작한다.
REQUIRES_NEW는 항상 새로운 트랜잭션을 시작한다. 이미 진행 중인 트랜잭션이 있으면 일시 중단시키고 새로운 트랜잭션을 시작한다.
REQUIRES_NEW는 기존 트랜잭션과 별도로 사용될 경우 사용한다. 이거를 감싸고 있는 트랜잭션이 실패해도 REQUIRES_NEW는 성공해야 할 때 사용된다.
JPA에서 트랜잭션 전파 모드는 트랜잭션이 이미 존재하는 상황에서 메서드가 호출될 때, 그 메서드가 어떻게 동작할지를 결정하는 방식이다. 즉, 하나의 트랜잭션이 진행 중일 때 새롭게 호출된 메서드가 그 트랜잭션에 참여할지, 아니면 별도의 트랜잭션을 시작할지 등을 정의하는것이다.
- REQUIRED(기본값)
- 설명: 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 새로운 트랜잭션을 시작한다.
- 사용 예시: 일반적으로 트랜잭션이 필요할 때 사용한다. 여러 작업이 하나의 트랜잭션으로 묶여야 할 때 사용한다.
- 예시: A 계좌에서 출금하고 B 계좌에 입금하는 작업이 하나의 트랜잭션으로 처리되어야 할 때 사용됩니다.
- REQUIRES_NEW
- 설명: 항상 새로운 트랜잭션을 시작한다. 이미 진행 중인 트랜잭션이 있으면 일시 중단시키고 새로운 트랜잭션을 시작한다.
- 사용 예시: 기존 트랜잭션과는 별도로 처리되어야 하는 작업에 사용됩니다. 예를 들어, 로깅 등이 독립적으로 처리되어야 할 때 사용됩니다.
- 예시: A 계좌에서 출금하는 작업에 실패해도 로깅 작업은 성공해야 할 때 사용됩니다.
- MANDATORY
- 설명: 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 예외를 발생시킨다.
- SUPPORTS
- 설명: 이미 진행 중인 트랜잭션이 있으면 그 트랜잭션에 참여하고, 없으면 트랜잭션 없이 실행된다.
- NOT_SUPPORTED
- 설명: 트랜잭션 없이 실행된다. 이미 진행 중인 트랜잭션이 있으면 일시 중단시키고 트랜잭션 없이 실행된다.
- NEVER
- 설명: 트랜잭션 없이 실행된다. 이미 진행 중인 트랜잭션이 있으면 예외를 발생시킨다.
- NESTED
- 설명: 이미 진행 중인 트랜잭션이 있으면 중첩 트랜잭션으로 처리되고, 없으면 새로운 트랜잭션을 시작한다.