스프링 트랜잭션 옵션 소개

학습 페이지

스프링 트랜잭션 애너테이션에도 다양한 옵션들이 있다. 애너테이션 스펙을 보자.

package org.springframework.transaction.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.aot.hint.annotation.Reflective;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Reflective
public @interface Transactional {
    @AliasFor("transactionManager")
    String value() default "";

    @AliasFor("value")
    String transactionManager() default "";

    String[] label() default {};

    Propagation propagation() default Propagation.REQUIRED;

    Isolation isolation() default Isolation.DEFAULT;

    int timeout() default -1;

    String timeoutString() default "";

    boolean readOnly() default false;

    Class<? extends Throwable>[] rollbackFor() default {};

    String[] rollbackForClassName() default {};

    Class<? extends Throwable>[] noRollbackFor() default {};

    String[] noRollbackForClassName() default {};
}

value, transactionmanager

트랜잭션을 제대로 사용하려면 먼저 스프링 빈에 등록된 어떤 트랜잭션 매니저를 사용할지를 알아야 한다. @Transactional 어노테이션 사용시에도 어떤 트랜잭션 매니절르 사용할지 지정할 수 있다.

사용법은 간단함. value 옵션이나 transactionmanager 옵션 하나에 트랜잭션 매니저의 스프링 빈 이름을 적어주면 된다.

💡 참고로 모든 애너테이션에서 속성이 하나이고, 그 속성이 value 일 경우 value 는 생략 가능하다.

 public class TxService {
 
    @Transactional("memberTxManager")
 public void member() {...}
 
    @Transactional("orderTxManager")
 public void order() {...}
 
 }

RollbackFor

예외가 발생할때 스프링 트랜잭션의 기본 정책은 다음과 같다.

  1. 언체크 예외인 RuntimeException, Error 와 그 하위 예외가 발생하면 롤백
  2. 체크 예외인 Exception, 그 하위예외는 커밋

예외가 발생했는데 왜 커밋할까…??

이런 기본 정책 외에 RollbackFor 를 통해 롤백할 예외를 추가적으로 지정할 수 있다.