스프링 트랜잭션 애너테이션에도 다양한 옵션들이 있다. 애너테이션 스펙을 보자.
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 {};
}
트랜잭션을 제대로 사용하려면 먼저 스프링 빈에 등록된 어떤 트랜잭션 매니저를 사용할지를 알아야 한다. @Transactional
어노테이션 사용시에도 어떤 트랜잭션 매니절르 사용할지 지정할 수 있다.
사용법은 간단함. value
옵션이나 transactionmanager
옵션 하나에 트랜잭션 매니저의 스프링 빈 이름을 적어주면 된다.
💡 참고로 모든 애너테이션에서 속성이 하나이고, 그 속성이
value
일 경우value
는 생략 가능하다.
public class TxService {
@Transactional("memberTxManager")
public void member() {...}
@Transactional("orderTxManager")
public void order() {...}
}
예외가 발생할때 스프링 트랜잭션의 기본 정책은 다음과 같다.
RuntimeException
, Error
와 그 하위 예외가 발생하면 롤백Exception
, 그 하위예외는 커밋예외가 발생했는데 왜 커밋할까…??
이런 기본 정책 외에 RollbackFor
를 통해 롤백할 예외를 추가적으로 지정할 수 있다.