使用Spring事务与Mybatis批处理

时间:2018-02-02 13:30:04

标签: java spring mybatis spring-mybatis

我有一个@Transactional方法,它在公共spring bean上调用另一个方法,该方法一直用于执行batch操作,跨映射器。现在的问题是,如果@Transactional方法中存在错误,则batch上执行的DML不会回滚,因为它们是在不同的会话上执行的与它自己的交易。

public class HamsterRepo{
...

 @Autowired 
 BatchOperationBean<Hamsters> idioticBatchBean;
 @Transactional
 public void saveHamsters(List<Hamsters> hams){
  idioticBatchBean.executebatch("saveHamsters", hams);
 }
}
 public class BatchOperationBean<T>{
 @Autowired 
 SqlSessionFactory sqlFactory; 

 public void executebatch(String mapperId, List<T> ts){
  SqlSession sqlSession = 
  this.sqlSessionFactory.openSession(ExecutorType.BATCH,
                TransactionIsolationLevel.SERIALIZABLE); 
  try(sqlSession){
   for(T t in ts){
    sqlSession.update(mapperId , t);
   }
  sqlSession.commit();
  // Clean Up stuff and Exception Handling...
  }
 }
}

现在,有没有办法将两个Spring Tx and SqlSessionFactory联系起来?是否会注入SqlSession而不是工厂帮助?或者有没有办法从Spring Tx获取SqlSession?或者在Spring中识别&amp;在没有SqlSesion的情况下跨映射器执行查询?

PS:使用Spring 4.1.7,Mybatis:3.4.4,Mybatis-spring:1.3.1

1 个答案:

答案 0 :(得分:1)

看起来链接Spring Transaction和Mybatis SqlSession的方法是SqlSessionTemplate

  

线程安全,Spring管理,SqlSession与Spring事务管理一起工作,以确保使用的实际SqlSession是与当前Spring事务关联的那个。此外,它还管理会话生命周期,包括根据Spring事务配置关闭,提交或回滚会话。