【请进】Mybatis多数据源 怎么在一个@Transactional方法里做两个数据源操作

Ambitor 发布于 2016/06/27 15:14
阅读 1K+
收藏 2

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

@Transactional
public void test(){

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

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

}

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



加载中
0
Gillian_Male
Gillian_Male

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

0
Ambitor
Ambitor

引用来自“Gillian_Male”的评论

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

我并不想要对不同数据源进行事务控制,我只是想有个默认的数据源A是开启事务的,然后涉及到数据源B的只做查询。意思是在有事务的方法里面切换数据源进行(非事务)操作,然后执行完后在切回数据源A,知道方法执行完再提交数据源A,目前通过改写感觉已经初步达到效果 但是两个数据源都有开事务(这是我不想要的),并且一致性有待测试。
0
Ambitor
Ambitor

引用来自“_DeepBlue”的评论

JTA
JTA暂时不考虑。
0
alexgaoyh
alexgaoyh
默认的数据源A是开启事务的,对数据源B进行查询操作的时候,不走框架控制不就行了? 不存在切换数据源的概念了···
Ambitor
Ambitor
是的,目前思想框架当然用,只是把数据源B的操作交给了spring-jdbc 然后数据源A的交给了mybatis 然后spring声明事务是数据源A的。 最初是想简单的用一个工具操作 然后都交给spring。。所以会想着折腾源码 ,虽然最终还是没弄,或者说 弄好了但不敢再生产用,哈哈 还是学到了很多东西
0
风中蜡烛
风中蜡烛
建议前面加一个数据库中间件。如mycat,就能很好的解决
0
haoran_10
haoran_10
试试二阶段提交
0
不愿透露姓名的Mr成
不愿透露姓名的Mr成
通过AOP实现,在方法开始前开启多个事务放到一个队列里,执行方法体,当有异常时,回滚队列里的事务,成功时全部提交!目前已经实现
0
秋小天石

楼主这个问题有解决吗?

Ambitor
Ambitor
好像不是很好解决 始终有点小问题。这种事情还是用编程事务吧
返回顶部
顶部