中途参与项目开发,发现注解式和手动提交的方式,都不回滚,已经排除了spring事务失效的场景,就是纯粹的不回滚。百度了一天,大多说是数数据源的问题,确实如此,我们项目里的数据源是动态切换的。如果是这个问题,那应该怎么跨库让事务生效呢?(不是微服务,不能做分布式事务)
看看这个博客对你有帮助不,我能想到的也就是各种补偿机制
https://blog.csdn.net/u011702673/article/details/121918780
这种模式,太容易出问题了。
不知道你们是哪种方案做的切换,如果是基于AbstractRoutingDataSource实现的动态切换,你甚至在事务下都不能做切换,直接复用connection,代码中走到的第二个库直接失败
如果是一个数据源配一整套orm配置的方案,他这个稍微好处理点,原因大概率是在于开启事务只有一次,开启事务会将connection的自动提交设置为false,所以除开第一个数据库保证了事务,其他数据库直接被提交,但是这种我没有自己尝试过,是不是真实原因就是我猜的,这就要你自己debug了,如果是猜测的这样,你改写的地方也不少,第一个就是datasource的getconnection方法,如果有事务的场景下,将自动提交设置为false,一个事务内多次使用一个库,你还需要保证是同一个connection,同时也要监听事务提交事件,需要将其他数据源设置为false的connection也一起提交,不然导致其他connection的操作无法提交,这就是修改引入了,
我之前自己实现过一套,参考Sharding-JDBC,基于jdk的动态代理,数据源生成的connect做一层代理,由代理的connection决定是自己手动重新获取真实的物理连接,还是复用之前产生的物理连接,对你使用什么orm框架都无限制,是对底层jdbc组件的扩展
Spring如何管理多数据源事务
如有帮助,望采纳
https://blog.csdn.net/chenzoff/article/details/125077167
不要跨库操作加事务,对同一个库中的数据做事务是可以的,如果非要做跨库做事务,那就只有自己维护事务了