본문 바로가기
Backend

@Transactional(propagation = REQUIRES_NEW) 주의할점

by 당리 2026. 1. 11.

“별도 클래스”로 분리

Spring에서 REQUIRES_NEW는 말 그대로 **“기존 트랜잭션을 잠시 중단하고, 완전히 새로운 트랜잭션을 시작”**하는 옵션이다.
Chunk Commit, 배치 처리, 부분 커밋, 실패해도 일부만 저장해야 하는 로직에서 거의 필수로 쓰인다.

그런데 이 옵션은 아무 데나 붙인다고 동작하지 않는다.
특히 같은 클래스 안에서 호출하면 안 먹힌다.

 

1. Spring 트랜잭션은 “프록시”로 동작한다

Spring의 @Transactional은 AOP 프록시 기반이다.

즉, 실제 구조는 이렇다.

 
Client → Transaction Proxy → Service Bean → method()

@Transactional이 붙은 메서드는
프록시 객체를 통해 호출될 때만 트랜잭션이 열린다.

 

 

2. 같은 클래스에서 호출하면 프록시를 안 탄다 (Self-Invocation)

 

이게 왜 치명적이냐

 
  • 실제로는 하나의 트랜잭션
  • 수만 건 커밋이 안 나뉨
  • Undo, Redo, Lock, Rollback 전부 누적
  • 장애 나면 전부 롤백

즉,

“나는 Chunk Commit 했다고 믿었는데
DB는 풀 트랜잭션으로 처리하고 있었다”

이게 제일 위험한 상황이다.

 

 

 

 

'Backend' 카테고리의 다른 글

Spring Boot 버전 비교 4.0.0 vs 3.2.x vs 2.7.x  (0) 2026.02.01
SqlSessionTemplate란?  (1) 2026.01.19
@Transactional(propagation = REQUIRES_NEW)  (0) 2026.01.04
Chunk Commit  (0) 2025.12.28
JVM GC  (0) 2025.12.21