2024-12-03 更新,在公众号上刷到了鱼皮转发的文章,这一篇更全面,绝对的宝藏文章
------------------------------------------
当时自己总结的这几个 CASE 在大佬的文章里也有提到,如果认真看完了上面这篇文章那就不用看我写的啦
------------------------------------------
假设在某个方法中,需要同时对 A、B 库进行相关的增删改查操作
1、当其中的库 A 仅做查询操作时,可以在事务开启前先将库 A 的数据查出后作为参数,下一步再调用开启事务的方法(注意两个方法不能在同一个 service,否则事务会失效,PS:只有当事务方法被当前类以外的代码调用时,才会由 Spring 生成的代理对象来管理。 )
2、如果库 A 为主要事务的数据源,而库 B 仅仅在库 A 处理完数据后做切库插入的操作,那么可以通过开启新事务的方式来解决(最好插入是放在最后,后续会说明)。
2.1 当库 B 是在最后操作的,那么库 B 操作报错后库 A 也能回滚,这是最理想的状况。
2.2 如果库 B 是在中间操作的,那么就会产生 A 报错后 B 无法回滚的尴尬情况。
3、通过事务挂起,也可以达到切换数据源的目的,但是该方法要慎重使用,除非你的操作仅仅只是做查询。可以看作是对方法 1 的一种补充,当库 A 需要 库 B 经过一系列数据处理后才能做查询时,就可以使用该方法。