Post

03 Transactional

03 Transactional

1. Transactional

1. Transactional

  • 스프링에서 제공하는 선언적 트랜잭션 관리 어노테이션
  • 메서드나 클래스에 붙이면 트랜잭션 범위를 정의할 수 있음
  • 핵심 역할: DB 작업을 하나의 트랜잭션 단위로 묶어서 모두 성공하거나 모두 실패하게 관리

2. 동작의 흐름

  • 메서드 시작 → 트랜잭션 시작
  • 메서드 정상 종료 → 트랜잭션 커밋
  • 메서드에서 RuntimeException 발생 → 트랜잭션 롤백
  • 체크 예외(Exception)는 기본적으로 롤백하지 않음 (설정 변경 가능)

3. 특징

항목내용
선언적메서드/클래스에 어노테이션만 붙이면 트랜잭션 적용
AOP 기반프록시를 통해 메서드 실행 전후로 트랜잭션 시작/종료
자동 커밋/롤백정상 시 커밋, 예외 발생 시 롤백 (설정 가능)
propagation메서드 간 호출 시 트랜잭션 전파 전략 설정 가능

2. Propagation

1. 트랜잭션 전파

  • 트랜잭션은 DB 작업 단위를 하나의 묶음으로 관리하는 것
  • 스프링에서 @Transactional을 메서드에 붙이면 그 메서드가 트랜잭션 안에서 실행됨
  • 전파(Propagation)는 이미 트랜잭션이 존재할 때 새로운 메서드 호출이 그 트랜잭션과 어떻게 관계를 맺을지를 정의한 것
  • 즉, 메서드 간 트랜잭션 연결 방식을 설정하는 옵션.

2. 트랜잭션 전파옵션

Propagation설명
REQUIRED (기본값)현재 트랜잭션이 있으면 참여, 없으면 새로 생성
REQUIRES_NEW무조건 새 트랜잭션 생성, 기존 트랜잭션은 잠시 보류
SUPPORTS현재 트랜잭션이 있으면 참여, 없으면 트랜잭션 없이 실행
NOT_SUPPORTED현재 트랜잭션이 있으면 일시 중단하고 트랜잭션 없이 실행
MANDATORY현재 트랜잭션이 반드시 있어야 함, 없으면 예외
NEVER트랜잭션이 있으면 예외, 없으면 실행
NESTED현재 트랜잭션 안에서 중첩 트랜잭션 생성 (savepoint 사용)

3. 사용

  • 어노테이션 옵션으로 사용함
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
     @Service
     public class PaymentService {
    
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void pay() {
         // 항상 새로운 트랜잭션 생성
         // 독립적으로 commit/rollback 됨
     }
     }
    
This post is licensed under CC BY 4.0 by the author.