public @interface Transactional {
String value() default "";
String transactionManager() default "";
Class<? extends Throwable>[] rollbackFor() default {};
Class<? extends Throwable>[] noRollbackFor() default {};
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
boolean readOnly() default false;
String[] label() default {};
}
value, transactionManager
스프링 빈에 등록된 어떤 트랜잭션 매니저를 사용할지 선택하기 위한 옵션이다.
(직접 트랜잭션을 사용할 때 트랜잭션 매니저를 주입 받아서 사용했던 것처럼)
만약 생략하면 기본으로 등록된 트랜잭션 매니저를 사용하는데 사용하는 트랜잭션 매니저가 2개 이상이면 지정해서 사용해야 한다.
rollbackFor
기본 정책은 언체크 예외가 발생할 경우 롤, 체크 예외한 예외는 커밋하는 것이다.
체크 예외에서 롤백을 원할 경우 지정한다.
noRollbackFor
기본 정책에 추가로 어떤 예외가 발생했을 때 롤백하는 안되는지 지정할 수 있다.
propagation
트랜잭션 전파
isolation
트랜잭션 격리 수준
보통 DB에서 설정한 기준을 따른다. (default)
timeout
트랜잭션 수행 시간에 대한 타임아웃을 초 단위로 지정한다.
기본 값은 트랜잭션 시스템의 타임아웃을 사용함
readOnly
트랜잭션은 기본적으로 읽기, 쓰기가 가능하다.
읽기 전용 트랜잭션을 사용하면 다양한 성능 최적화가 발생한다.
프레임워크
읽기 전용 트랜잭션 안에서 변경 기능을 실행하면 예외를 던진다.
JPA는 커밋 시점에 플러시를 호출하지 않는다.
JDBC 드라이버
읽기 전용 트랜잭션에서 변경 쿼리가 발생하면 예외를 던진다.
읽기, 쓰기 (마스터,슬레이브) DB를 구분해서 요청한다. 읽기 전용의 경우 읽기(슬레이브) DB의 커넥션을 획득해 사용한다.
DB
읽기 전용 트랜잭션의 경우, 내부에서 성능 최적화가 발생한다.