2016-06-13 4 views
0

트랜잭션을 관리하기 위해 transactionTemplate을 사용하려고합니다. 코드는 아래와 같이 나열 될 수 있습니다 :transactionTemplate이 mybatis와 작동하지 않지만 이유를 모르겠습니다.

private Boolean isCleanSuccess(){ 
    return transactionTemplate.execute(new TransactionCallback<Boolean>() { 
     @Override 
     public Boolean doInTransaction(TransactionStatus transactionStatus) { 
      String rmcName = "sync"; 
      StringBuilder sbSync = new StringBuilder(); 
      sbSync.append("delete from `t_sync_data_plan` WHERE 1=1"); 
      StringBuilder sbRmc = new StringBuilder(); 
      sbRmc.append("delete from `t_rmc_data` where `name`=\"") 
        .append(rmcName) 
        .append("\""); 
      try{ 
       jdbcTemplate.execute(sbSync.toString()); 
       jdbcTemplate.execute(sbRmc.toString()); 
       /** 
        * throw the exception to make it rollback 
        */ 
       // throw new RuntimeException(); 
       return true; 
      }catch (Exception ex){ 
       LOG.error(ex); 
       transactionStatus.setRollbackOnly(); 
       return false; 
      } 
     } 
    }); 
} 

jdbcTemplate을 사용하여 Dao를 처리 할 때 작동합니다. 그러나 MyBatis를 사용할 때 Exception을 throw하면 롤백 할 수 없습니다. XML 코드는 다음과 같이 나열 롤백 그냥 JdbcTemplate을 아래에서 작동하지만 MyBatis로 아래 효능을 잃는 이유를 모르겠어요

. 테이블의 엔진은 InnoDB입니다. 제게 손을 쥐어 주시겠습니까? 거의 2 주 동안 저를 당황 시켰습니다. 나의 가난한 영어가 가져온 불편을 끼쳐 드려 죄송합니다. 이 같은

답변

0

시도 뭔가 :

import org.apache.commons.dbcp2.BasicDataSource; 
import org.apache.ibatis.session.SqlSessionFactory; 
import org.mybatis.spring.SqlSessionFactoryBean; 
import org.springframework.jdbc.datasource.DataSourceTransactionManager; 

...

@Value("${database.ip}") 
private String databaseIp; 

@Value("${database.user}") 
private String user; 

@Value("${database.password}") 
private String password; 

@Bean 
public DataSource getMybatisDataSource() throws URISyntaxException { 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 

    dataSource.setUrl("jdbc:mysql://"+databaseIp+":3306/swords"); 
    dataSource.setUsername(user); 
    dataSource.setPassword(password); 

    return dataSource; 
} 

@Bean 
public DataSourceTransactionManager transactionManager() throws URISyntaxException { 
    return new DataSourceTransactionManager(getMybatisDataSource()); 
} 

@Bean 
public SqlSessionFactory sqlSessionFactory() throws Exception { 
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
    sessionFactory.setDataSource(getMybatisDataSource()); 

    return sessionFactory.getObject(); 
} 

당신은 단순히 @Transacional를 사용할 수있는이 방법.

상세 정보 : 당신의 대답에 대한 http://www.mybatis.org/spring/

+0

감사합니다. 'multipleDataSource'에 문제가있는 것 같습니다. 제 동료가 원인을 찾아 내서이 버그를 수정했습니다. 한 번에 @Transactional을 사용하려고하지만 내 코드 스타일은 다른 사람과 일치해야합니다. ' 어쨌든 고마워! – Merorin