在MyBatis-Plus中,@DSTransactional注解用于标记事务的边界,确保一组数据库操作要么全部成功,要么全部失败,以保持数据的一致性。这个注解是MyBatis-Plus提供的一个便捷的事务管理方式,它基于Spring的事务管理框架。 1. @DSTransactional注解的作用 @DSTransactional注解的主要作用是控制数据库操作的事务性。当一个方法被@...
因为一次使用mybatis plus @DS 注解实现多数据源切换时,在一个controller中同时操作多个数据源的service方法,为了保证这一组操作下数据的完整性,则需要使用事务@Transaction进行保证,于是乎,粗暴的在controller方法上加上了该注解,原以为可以万事大吉,一运行程序发现数据源切换失败了!一泼凉水浇的是透心凉~ ,好在问题...
然而这种写法存在一个问题,就是不同环境库名可能不同,到时候要么把库名改一致,要么改代码,比较麻烦。 而究其根源,这个问题的主要原因在于主库对应Service的方法中加了事务@Transactional,而默认传递机制为REQUIRED,导致被调用的Service加入了该事务,从而与调用方使用了相同的库。 解决方法就是在被调用的方法上把事务传...
在这个事务内的所有数据库操作,都是在事务连接建立之后,所以会产生数据源没有切换的问题; 为了使@DS起作用,必须替换数据库连接,也就是改变事务的传播机智,产生新的事务,获取新的数据库连接; 所以bookService的save方法上除了加@Transactional外,还需要设置propagation = Propagation.REQUIRES_NEW 使得代码走以下逻辑: 1...
pointcut.setExpression("@annotation(com.baomidou.dynamic.datasource.annotation.DSTransactional)"); return new DefaultPointcutAdvisor(pointcut, new DynamicTransactionAdvisor()); } //动态参数解析器链 @Bean @ConditionalOnMissingBean public DsProcessor dsProcessor() { ...
由于使用了微服务,会有多个数据库的情况,有时业务需要,需要切换数据源,所以使用了Mybatis plus的@DS来切换多数据源 yml数据库配置如下:service如下,默认是master数据源 userService bookService 但是神奇的事发生的,bookService的数据库应该是common,但是却是master的,也就是说@DS切换数据源没有起作用 于是开始...
为了使@DS起作用,必须替换数据库连接,也就是改变事务的传播机智,产生新的事务,获取新的数据库连接; 所以service方法上除了加@Transactional外,还需要设置propagation = Propagation.REQUIRES_NEW参数. 我这里主要介绍使用原生SpringBoot方式让Mybatis-Plus轻松实现多数据源,需要的朋友可以参考下. ...
4. 5. 6. 7. 8. 9. 10. 11. 注意:在同一个方法中切换数据源,可以在最终调用的mapper或者service上家@DS实现或者用上边的方法实现, 但是: 在同一个方法中切换数据源,该方法上有事务注解(@Transactional)时,动态数据源切换失效,不管DS还是DynamicDataSourceContextHolder都失效,所以尽量拆到service中不同的方法...
其实在mybatis-plus就有相关的实现,是一个基于SpringBoot快速集成多数据源的启动器。 首先要搭建一个springBoot+Mybatis+Mybatis-Plus的项目,搭建项目就不演示了,比较简单。这里讲怎么使用多数据源,首先引入dynamic-datasource-spring-boot-starter。 代码语言:javascript ...
所以在该事务内的所有操作,都是 Spring 在之前获取的连接,动态切换就失效了 解决: 要想动态切换数据源生效,则需要 mybatis-plus 去获取数据库连接,所以解决办法一:去除@Transactional,不让 Spring 获取事务 使用@Transactional(propagation = Propagation.REQUIRES_NEW),开启事务,且动态数据源切换生效...