선언적 트랜잭션의 여러 옵션에 대해 간단히 알아보자.
1. value, transactionManager
String value() default "";
String transactionManager() default "";
트랜잭션을 사용하려면 스프링 컨테이너에서 어떤 트랜잭션 매니저를 사용할지 알아야 한다. 선언적 트랜잭션이 아닌 프로그래밍적으로 트랜잭션을 사용할 때 우리는 트랜잭션 매니저를 주입받아 사용했다.
@Transactional을 사용할 때 별도의 트랜잭션 매니저를 지정하지 않았는데, 선언적 트랜잭션에서도 트랜잭션 매니저를 지정해주어야 한다. 다만 지정하지 않으면 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략한다.
다만 사용하는 트랜잭션 매니저가 둘 이상이라면 위 옵션을 사용해 지정하여 구분할 수 있다.
...java
@Transactional("JobTxManager")
public void member() {...}
@Transactional("orderTxManger")
public void order() {...}
애노테이션 속성이 하나인 경우 value는 생략하고 값을 바로 넣을 수 있다.
2. rollbackFor
예외 발생 시 스프링 트랜잭션의 기본 정책은 다음과 같다.
1. 언체크 예외 발생 시 롤백한다.
2. 체크 예외는 커밋한다.
막상 하다 보면 체크 예외에도 롤백을 하고 싶을 때가 있다. 그럴 경우 rollbakFor 옵션을 사용해 기본 정책에 예외를 추가하여 롤백할 수 있다.
...java
@Transactional(rollbackFor = Exception.class)
이 경우에는 체크 예외인 Exception가 발생해도 롤백하게 된다. 다만 하위 예외들 또한 대상에 포함된다.
추가적으로 rollbackForClassName는 예외 이름을 문자로 넣으면 된다.
반대로 norollbackFor가 있으며 기본 정책에 추가로 어떤 예외가 발생했을 때 롤백하면 안 되는지 지정할 수 있다.
3. isolation
트랜잭션 격리 수준을 지정할 수 있는 옵션으로, 기본 값을 데이터베이스에서 설정한 트랜잭션 격리 수준을 사용하는 DEFAULT이다.
4. timeout
트랜잭션 수행 시간에 대한 타임아웃을 초 단위로 지정한다. 기본 값은 트랜잭션 시스템의 타임아웃을 사용한다.
운영 환경에 따라 동작 유무가 다르기에 확인 후 사용해야한다.
5.readOnly
트랜잭션은 기본적으로 읽기 쓰기가 모두 가능한 트랜잭션이 생성된다. 만약 이 값을 true로 사용하면 읽기 전용 트랜잭션이 사용되는데 이 경우 등록, 수정, 삭제가 안되고 읽기 기능만 작동한다.
그리고 readOnly 옵션을 사용하면 읽기에서 다양한 성능 최적화가 발생할 수 있다.
readOnly는 크게 3곳에서 적용된다.
- 프레임워크
- JDBC 드라이버
- 데이터베이스
각 스프링 버전별 트랜잭션에 대한 변경점과 추가에 대한 레퍼런스가 존재한다.
자신이 사용하는 버전에 따라 읽어보는 것도 좋을 것같다.
'Spring|Spring-boot' 카테고리의 다른 글
Apache Web Server and Spring Boot embedded tomcat 연동 (0) | 2022.11.12 |
---|---|
Spring Transaction Propagation (0) | 2022.10.16 |
Spring DB (5) (0) | 2022.10.14 |
Spring DB(6) (0) | 2022.09.27 |
Spring DB (4) (1) | 2022.09.19 |
댓글