2016-06-13 246 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

相关问题