项目源码地址
GitHub - liyanlei58/ssm: springboot druid mybatis plus 事务
最近想搭一套spring cloud开发环境,各种不顺利吧,先是spring cloud的组件某些功能不好用,是版本自身的bug。后来又碰到了事务无法回滚,这个搞了好几个周,我差点想要放弃,不得不说我有时候确实很执着,今天总算弄清楚了。一开始不知道是哪里错,后来网上找了一个好用的事务程序,但是切到我的项目上还是不好用,之后怀疑是springboot版本问题,怀疑都仅仅是怀疑。
因为mysql jar包,5.XXX的版本与8.XXX的版本的驱动不是一样的,所以把问题锁定到mysql驱动上了,这个是正解吧。网上找到了下面这篇文章,如文章所言我恰巧用的mysql-connector-java:8.0.28版本的jar包,但是按照他的操作我的问题并没有解决。建议自查!MySQL驱动Bug引发的事务不回滚问题,也许你正面临该风险! - 知乎
后来又找到了事务中动态切换数据源的问题 - 简书 文章,进一步了解数据源是怎么切换的,执行数据库操作的时候(增、删、改、查数据库表或者@Transactional注解开启事务的时候),mybatis会去创建链接,创建链接会选择数据源,在这个时候进行的数据源切换。
于是把这两个注解放到一起
切换数据源是AOP实现的,@Transactional注解也是AOP实现的,又出现一个切换执行顺序的问题,spring切面执行顺序-事务切面注意点 - 简书 看了这篇文章,在自定义注解的AOP切面上加上@Order(-1),问题终于算是解决了。事务可以正常,数据源也可以正常切换了。
附@Primary注解说明
其作用与功能,当有多个相同类型的bean时,使用@Primary来赋予bean更高的优先级。
Spring中@Primary注解_盲目的拾荒者的博客-CSDN博客