(30条消息) springboot+mybatis解决多数据源切换事务控制不生效的问题

网上好多的springboot的事务都是瞎扯,根本不起作用,后来通过各种渠道查证,springboot的声明式事务需要重写Transaction。
追溯源代码:
查看源代码中DataSourceTransactionManager这个类
当我们配置了事物管理器和拦截Service中的方法后,每次执行Service中方法前会开启一个事务,并且同时会缓存一些东西:DataSource、SqlSessionFactory、Connection等,所以,我们在外面再怎么设置要求切换数据源也没用,因为Conneciton都是从缓存中拿的,所以我们要想能够顺利的切换数据源,实际就是能够动态的根据DatabaseType获取不同的Connection,并且要求不能影响整个事物的特性。
主要是两个类:
1、MultiDataSourceTransaction:
2、MultiDataSourceTransactionFactory:
3、最后在mybatis的配置中加入这个sessionFactory:
4、最后在代码中引入
需要注意的是:
在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检查型异常(try catch)则不进行回滚操作:
故而如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

Loading Comments...