Spring Transaction 설정 방법. 에러발생? 롤백해.
Transaction 처리는 쉽게 말해 DB의 상태를 바꾸는 작업단위입니다.
예를 들어 Delete 후에 Insert 를 해야 하는 로직이 있다면,
이 Delete, Insert는 하나의 transaction으로 관리해야 합니다.
Delete는 잘 되었는데 Insert할때 에러가 난다면? 데이터는 증발하게 되겠죠.
그래서 Delete가 잘 되고, Insert도 잘 되어야만 Commit을 해야 합니다. 아니면 Rollback을 해야하죠.
Commit : 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어
Rollback : 작업 중 문제가 발생하였을때, 트랜젝션의 처리 과정에서 발생한 변경사항을 취소하고, 트랜젝션 과정을 종료.
그럼 Spring 에서 이 Transaction을 설정하는 방법을 알아보도록 하겠습니다.
Spring 설정파일 경로에 context-transaction.xml 파일을 추가합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">
<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>
<aop:config>
<aop:pointcut id="requiredTx" expression="execution(* 프로젝트경로..service.impl.*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
</aop:config>
</beans>
프로젝트의 모든 인터페이스를 상속받은 클래스의 모든 메소드를 기준으로 트랜젝션 설정을 합니다.
AOP에 대해서는 아래의 Link를 참고하세요.
Link : AOP 관련내용
그리고 트랜젝션 처리 할 메소드에 @Transactional 어노테이션을 추가해줍니다.
[예시 코드]
@Override
@Transactional
public void delResult(List<CompareVO> list) throws Exception{
try{
msdAnalMapper.delResult(list);
}catch(Exception e1){
LOGGER.error("MSD 삭제 에러", e1);
throw e1;
}
try {
msdAnalMapper.delDpResult(list);
} catch (Exception e2) {
LOGGER.error("MSD_DUP 삭제 에러", e2);
throw e2;
}
try{
msdAnalMapper.delCompareResult(list);
}catch(Exception e3){
LOGGER.error("COMPARE_RESULT 삭제 에러", e3);
throw e3;
}
try {
msdAnalMapper.delDpCompareResult(list);
} catch (Exception e4) {
LOGGER.error("DUP_COMPARE_RESULT 삭제 에러", e4);
throw e4;
}
}
위의 코드 처럼 작성을 하게되면 4개의 로직 중 하나의 로직에서 Exception이 발생하면
Exception 발생 전 트랜젝션을 모두 Rollback 하게 됩니다.
'Programing > Spring' 카테고리의 다른 글
Spring @Transactional 이 정상동작 하지 않는 이유 (0) | 2021.10.14 |
---|---|
Spring mybatis Oracle insert all 방법. 한번에 여러 행 추가 방법 list insert 방법 foreach insert (0) | 2020.04.06 |
Oracle mybatis foreach merge 방법 collection merge문 (0) | 2019.08.13 |
Mybatis Mapper XML <select> 알짜만 빼먹기 (1) | 2019.07.08 |
Spring Mybatis 멀티 database 연동 다중, 복수 데이터베이스 연동 oracle, mysql (2) | 2019.03.20 |
댓글