xrp_coil

2012년 5월 16일 수요일

spring에서 ibatis 트랜잭션(transaction) 처리.


기본적으로 사용하는 트랜잭션 처리가



 
try {
   sqlMap.startTransaction()
   Employee emp2 = new Employee();
   // ...set emp2 data
   Integer generatedKey = (Integer) sqlMap.insert ("insertEmployee", emp2);
   emp2.setFavouriteColour ("green");
   sqlMap.update("updateEmployee", emp2);
   sqlMap.commitTransaction();
}catch(Exception e){
    sqlMap.getCurrentConnection().rollback();
    e.printStackTrace();
    throw e;
} finally {
   sqlMap.endTransaction();
 }


위처런 startTransaction 과 endTransaction 을 사용하는 방식인데.

아무리 해도. 적용이 되지 않는다...
분명히 rollback 도 타는데 말이다.


검색질 중에 http://javastore.tistory.com/103 포스팅의 도움으로 해결.


applicationContext.xml 에 아래와 같이 추가한다.




daoImpl.java 에는 아래와 같이 setter를 만들어준다.

@Autowired
 private TransactionTemplate transactionTemplate;
 
 public void setTransactionTemplate(TransactionTemplate transactionTemplate){
  this.transactionTemplate = transactionTemplate;
 }


메서드 부분은 아래와 같다.


private int saveCaseLowReal(HashMap hmap) throws Exception {
                        ghmap = hmap;
   
   
   boolean result = false;
   result = (Boolean)transactionTemplate.execute( new TransactionCallback() {
    public Object doInTransaction(TransactionStatus status) {
     try {

                                                      /*인서트 로직.*/      

      return true;
     }catch (Exception e){
      e.printStackTrace();
      status.setRollbackOnly();
      return false;
     }
    }
   });

}


대략의 로직으로 보아 excute 하기 전에 true인지 false 인지 판별해서 던져주는듯 하지만..

불편하다...-_-;;;;;


이거보다 좋은 방법 있으신분은 링크를 댓글로 Plzzzzzzz..... ㅠㅠ


댓글 없음:

댓글 쓰기