我有一个@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
答案 0 :(得分:1)
看起来链接Spring Transaction和Mybatis SqlSession的方法是SqlSessionTemplate
线程安全,Spring管理,SqlSession与Spring事务管理一起工作,以确保使用的实际SqlSession是与当前Spring事务关联的那个。此外,它还管理会话生命周期,包括根据Spring事务配置关闭,提交或回滚会话。