본문 바로가기
Spring

트랜잭션 전파 다양한 옵션

by sangyunpark99 2025. 2. 17.
"트랜잭션 전파의 다른 옵션은 뭐가 있을까?"

 

이번글은 트랜잭션 전파의 다양한 옵션에 대해 알아보겠습니다.

 

 

트랜잭션 전파 옵션은 어떤게 있을까요?

 

REQUIRED, REQUIRES_NEW, SUPPORT, NOT_SUPPORT, MANDATORY, NEVER, NESTED가 있습니다.

 

REQUIRED

가장 많이 사용하는 기본 설정으로, 기존 트랜잭션이 없으면 생성하고, 있으면 참여합니다.

하나의 트랜잭션이 시작된 후에 다른 트랜잭션 경계가 설정된 메소드를 호출하면 자연스럽게 같은 트랜잭션으로 묶입니다.

 

REQUIRES_NEW

항상 새로운 트랜잭션을 생성합니다. 기존 트랜잭션이 없으면 새로운 트랜잭션을 생성하고, 기존 트랜잭션이 있는 경우 새로운 트랜잭션을 생성합니다.

 

SUPPORT

트랜잭션을 지원한다는 뜻입니다. 기존 트랜잭션이 있으면 참여하고, 트랜잭션이 없는 경우 트랜잭션 없이 진행합니다.

 

NOT_SUPPORT

트랜잭션을 지원하지 않는다는 의미입니다. 기존 트랜잭션이 없으면 트랜잭션 없이 진행하고, 트랜잭션이 있으면, 트랜잭션 없이 진행합니다.

 

MANDATORY

트랜잭션이 반드시 있어야 합니다. 기존 트랜잭션이 없는 경우 예외가 발생합니다.

기존 트랜잭션이 없으면 IllegalTransactionStateException 예외가 발생하고, 기존 트랜잭션이 있는 경우 기존 트랜잭션에 참여합니다.

 

NEVER

트랜잭션을 사용하지 않는다는 의미입니다. 기존 트랜잭션이 있으면 예외가 발생합니다. 기존 트랜잭션도 허용하지 않는 강한 부정의 의미입니다. 기존 트랜잭션이 없으면 트랜잭션 없이 진행하고, 기존 트랜잭션이 있으면 IllegalTransactionStateException 예외가 발생합니다.

 

NESTED

이미 진행 중인 트랜잭션이 있으면 중첩 트랜잭션을 시작하고, 기존 트랜잭션이 없는 경우 새로운 트랜잭션을 생성합니다.

중첩 트랜잭션은 외부 트랜잭션의 영향을 받지만, 중첩 트랜잭션은 외부에 영향을 주지 않습니다. 

중첩 트랜잭션이 롤백 되어도 외부 트랜잭션은 커밋할 수 있습니다. 외부 트랜잭션이 롤백 되면 중첩 트랜잭션도 함께 롤백됩니다.

 

중첩 트랜잭션은 언제 사용할까요?

 

다음과 같은 상황에 사용됩니다.

중요한 작업을 진행하는 중에 작업 로그를 DB에 저장해야 하는 상황이 있습니다.
그러나 로그를 저장하는 작업이 실패하더라도 메인 작업의 트랜잭션까지 롤백해서는 안 되는 경우가 있습니다.
반면에 로그를 남긴 후에 핵심 작업에서 예외가 발생하면 이땐 저장한 로그도 제거해야 합니다.
이러한 상황에서 로그 작업을 메인 트랜잭션에서 분리해서 중첩 트랜잭션으로 만들면 됩니다.

'Spring' 카테고리의 다른 글

Thread Local  (0) 2025.02.28
@Transactional 원리  (0) 2025.02.25
싱글톤 컨테이너  (0) 2025.02.17
트랜잭션 전파 REQUIRES_NEW 활용  (0) 2025.02.15
트랜잭션 전파(REQUIRES_NEW)  (0) 2025.02.14