16. 스프링부트 MVC - Transaction 속성 정리
in Gitlog on springboot-mvc
해당 포스팅에서는 트랜잭션 속성을 정리하기 위해 작성했다.
관련 포스팅
context-transaction.xml 샘플
<!-- Transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<!-- Transaction을 위한 AOP 설정 -->
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* neo..apps..service.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
<tx:annotation-driven />
name 메서드명
메서드의 이름이며 와일드 문자(*)를 사용할 수 있습니다.
name="*"
name="get*"
name="select*"
name="insert*"
name="delete*"
Propagation(전파) 속성
@Transactional의 propagation 속성을 이용해 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있다. 트랜잭션의 경계를 정의하며 시작 방법을 결정하는 속성이다.
@Transactional(propagation = Propagation.REQUIRED)
REQUIRED
(기본설정)
- 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성한다.
REQUIRES_NEW
- 부모 트랜잭션을 무시하고 무조건 새로운 트랜잭션이 생성, 이미 진행중인 트랜잭션이 있다면 잠깐 보류되고 해당 트랜잭션 경계가 종료 된 후 다시 시작된다.
SUPPORTS
- 이미 진행중인 부모 트랜잭션이 있으면 참여하고, 없을 경우 Non-transaction으로 실행된다.
NOT_SUPPORTED
- Non-transaction으로 시작하며, 이미 진행중인 트랜잭션이 있으면 끝날 때까지 보류된 후 실행된다.
MANDATORY
- 이미 진행중인 트랜잭션이 반드시 있어야만 실행되며, 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.
NEVER
- Non-transaction으로 시작하며, 실행되며 부모 트랜잭션이 존재한다면 예외가 발생합니다.
NESTED
- 이미 진행중인 부모 트랜잭션이 있을 경우 중첩 트랜잭션을 생성하여 실행되며, 생성된 중첩 트랜잭션은 부모 트랜잭션이 rollback되면 함께 되지만, 해당 트랜잭션안에서의 Commit/Rollback은 부모 트랜잭션에 영향을 주지 않는다.
Isolation(격리) 속성
트랜잭션에서 일관성이 없는 데이터를 허용하도록 하는 수준을 말한다.
@Transactional(isolation=Isolation.DEFAULT)
DEFAULT
(기본설정)
- 기본 격리 수준(, DB의 Isolation Level을 따름)
READ_UNCOMMITTED
- 커밋되지 않는(트랜잭션 처리중인) 데이터에 대한 읽기를 허용
READ_COMMITTED
- 트랜잭션이 커밋 된 확정 데이터만 읽기 허용
REPEATABLE_READ
- 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정하는 것을 막아준다. 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신/삭제를 보류한다.
SERIALIZABLE
- 가장 강력한 격리수준이다. 순차적으로 진행해서 여러 트랜잭션이 동시에 같은 테이블 정보를 엑세스하지 못하게 한다.
readOnly 속성
트랜잭션을 읽기 전용으로 설정할 수 있으며, 트랜잭션이 시작된 이후 INSERT, UPDATE, DELETE 같은 쓰기 작업이 진행되면 예외가 발생한다.
@Transactional(readOnly = true)
timeout 속성
지정한 시간 내에 해당 메소드 수행이 완료되이 않은 경우 rollback 수행
@Transactional(timeout=10)
rollback 예외
선언적 트랜잭션에서는 예외가 발생의 롤백 룰을 정의해서 런타임 에러 발생 시에 롤백한다.
@Transactional(rollbackFor=Exception.class)
rollbackFor
속성
- 특정 예외가 발생 시 강제로 Rollback
noRollbackFor
속성
- 특정 예외의 발생 시 Rollback 처리되지 않음
[참고]
- http://blog.breakingthat.com/2018/04/03/springboot-transaction-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98/