개발Story

프로젝트를 진행하다가 감리분의 지적에 의해 트랜잭션을 처리해야될 부분이 생겼다.

 

일단 컨트롤러에 있는 코드들을 service 단으로 옮기는것으로부터 작업을 시작했다.

 

controller 소스 -> service 옮기기 

 

service단으로 옮기고 나니 sql부분에 프로시저를 사용하는 mapper가 있다.

 

프로시저는 자동commit rollback이 안되어서 프로시저 sql구문안에 commit처리를 비지니스 로직단위로 해준다.

 

그래서 java단에서 아무리 rollback을 해줘봤자 db에서 commit을 한 상태여서 rollback 처리가 되지 않는다.

 

그래서 프로시저를 service단위로 쪼갯다....그리고 service처리!

 

------------네 여기까지게 제 상황입니다. 이제부터 트랜잭션 설정하는 부분을 알아보겠다--------------

 

 

1. context-transaction.xml에 

<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.트랜잭션처리를 배웠다!

 

profile

개발Story

@슬래기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!