프로젝트를 진행하다가 감리분의 지적에 의해 트랜잭션을 처리해야될 부분이 생겼다.
일단 컨트롤러에 있는 코드들을 service 단으로 옮기는것으로부터 작업을 시작했다.
controller 소스 -> service 옮기기
service단으로 옮기고 나니 sql부분에 프로시저를 사용하는 mapper가 있다.
프로시저는 자동commit rollback이 안되어서 프로시저 sql구문안에 commit처리를 비지니스 로직단위로 해준다.
그래서 java단에서 아무리 rollback을 해줘봤자 db에서 commit을 한 상태여서 rollback 처리가 되지 않는다.
그래서 프로시저를 service단위로 쪼갯다....그리고 service처리!
------------네 여기까지게 제 상황입니다. 이제부터 트랜잭션 설정하는 부분을 알아보겠다--------------
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
<bean>
<tx:annotation-driven transaction-manager="txManager" proxy-target-class="true"/>
추가 !
2. service 단위에 try catch문을 이용하여 예외가 발생했을 경우 트랜잭션을 처리!
어째서인지 @Transactional(rollbackFor=Exception.class) 어노테이션이 작동하지 않는다...흠..나중에 해볼게요.
service단에
@Autowired
PlatformTransactionManager txManager;
// 주입시켜주고.
메서드 ( ) {
//트랜잭션의 시작을 알린다.(트랜잭션을 얻어오는 시점이 시작)
TransactionStatus status = this.txManager.getTransaction(new DefaultTransactionDefinition());
try{코드 }
catch(Exception e) {
//예외가 났을경우 롤백처리!
this.txManager.rollback(status);
}
//정상진행 커밋해주기 처리를 안해주면 전부다 롤백되는 현상이 발생.
this.txManager.commit(status);
}
배운점 : 1.프로시저는 java단에서는 트랜잭션 rollback처리가 안된다.
2.컨트롤러에 코드를 박아두지 말자.....
3.트랜잭션처리를 배웠다!