Mybatis和Spring集成 sessionFactory.openSession() 事务不生效问题

问题描述

  • Mybatis和Spring集成,查阅官方文档,得知Spring总会为你处理事务。
  • 官方文档连接:http://mybatis.org/spring/zh/transactions.html
  • 其中描述到:
    • MyBatis 的 SqlSession 提供几个方法来在代码中处理事务。但是当使用 MyBatis-Spring 时,你的 bean 将会注入由 Spring 管理的 SqlSession 或映射器。也就是说,Spring 总是为你处理了事务。
    • 无论 JDBC 连接是否设置为自动提交,调用 SqlSession 数据方法或在 Spring 事务之外调用任何在映射器中方法,事务都将会自动被提交。

解决方案

  • 根据文档,有以下的解决方案:
  • 先开启Spring事务功能,在 Spring 的配置文件中创建一个 DataSourceTransactionManager 对象:
@Bean
public DataSourceTransactionManager transactionManager() {
  return new DataSourceTransactionManager(dataSource());
}
  • 然后自己手工管理事务:
TransactionStatus txStatus =
    transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
  userMapper.insertUser(user);
} catch (Exception e) {
  transactionManager.rollback(txStatus);
  throw e;
}
transactionManager.commit(txStatus);
  • 在使用 TransactionTemplate 的时候,可以省略对 commit 和 rollback 方法的调用。
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(txStatus -> {
  userMapper.insertUser(user);
  return null;
});

你可能感兴趣的:(JavaWeb)