2016-06-13 144 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的,它的工作原理。但是,如果我在使用myBatis時拋出異常,它就不能回滾。該XML代碼列出如下:

我不知道爲什麼回滾只是工作的JdbcTemplate下,但在MyBatis的失去功效。表的引擎是InnoDB。 你能幫我一下嗎?近兩週我一直困惑不解。 對不起,我可憐的英語帶來了不便。

回答

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

相關問題