7
回答
【请进】Mybatis多数据源 怎么在一个@Transactional方法里做两个数据源操作
华为云实践训练营,热门技术免费实践!>>>   

如题,请问Mybatis多数据源 怎么在一个@Transactional方法里做两个数据源操作,伪代码如下

@Transactional
public void test(){

 xxMapper.update();//数据源A的修改操作

 yyMapper.select();//数据源B的查询操作

}

因为事务交给Spring管理后,只要开启事务,事务会绑定SqlSessionFactory,保证在事务里的所有查询都使用一个SqlSessionFactory,这样数据源B的查询操作就没法做了,我现在通过写一个自定义的SqlSessionTemplate,重写getSessionFactory方法,然后调试进Spring-mybatis源码后发现数据源A数据源B的操作都开事务了,在线等。



举报
Ambitor
发帖于1年前 7回/1K+阅
共有7个答案 最后回答: 1年前

按道理说是不行的,spring事务的原理是,在你对多个update,insert进行操作是,首先使用一个数据库连接,begin 开启数据库事务,然后都执行成功之后,commit,如果你对多个数据源进行操作,那明显不在一个连接里了,更不用说在一个mysql事务里了。要想对不同数据源进行事务控制,其实和分布式事务的原理是一样的,采用多阶段提交的方式,不过这个可能要自己写点东西。

引用来自“Gillian_Male”的评论

按道理说是不行的,spring事务的原理是,在你对多个update,insert进行操作是,首先使用一个数据库连接,begin 开启数据库事务,然后都执行成功之后,commit,如果你对多个数据源进行操作,那明显不在一个连接里了,更不用说在一个mysql事务里了。要想对不同数据源进行事务控制,其实和分布式事务的原理是一样的,采用多阶段提交的方式,不过这个可能要自己写点东西。

我并不想要对不同数据源进行事务控制,我只是想有个默认的数据源A是开启事务的,然后涉及到数据源B的只做查询。意思是在有事务的方法里面切换数据源进行(非事务)操作,然后执行完后在切回数据源A,知道方法执行完再提交数据源A,目前通过改写感觉已经初步达到效果 但是两个数据源都有开事务(这是我不想要的),并且一致性有待测试。
默认的数据源A是开启事务的,对数据源B进行查询操作的时候,不走框架控制不就行了? 不存在切换数据源的概念了···
--- 共有 1 条评论 ---
Ambitor是的,目前思想框架当然用,只是把数据源B的操作交给了spring-jdbc 然后数据源A的交给了mybatis 然后spring声明事务是数据源A的。 最初是想简单的用一个工具操作 然后都交给spring。。所以会想着折腾源码 ,虽然最终还是没弄,或者说 弄好了但不敢再生产用,哈哈 还是学到了很多东西 1年前 回复
顶部