背景
在业务中,会同时保存数据到两个数据源的情况,还要保持数据的一致性,就要用到全局事务。
使用spring注解@Transactional不能控制两个数据源的事务,会导致数据源无法切换。
实现方案
本章使用的是mybatis-plus提供的dynamic-datasource框架实现
使用方式
1.引入dynamic-datasource-spring-boot-starter
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${version}</version>
</dependency>
2.配置yml
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
strict: true #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
datasource:
# 主库数据源
master:
url: jdbc:mysql://xxx.xxx.xx.xx:3306/xxxx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
# 从库数据源
slave:
# 从数据源开关/默认关闭
#enabled: true
url: jdbc:mysql:/xxx.xxx.xx.xx:3336/xxxx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
pgsql:
# 从数据源开关/默认关闭
#enabled: true
url: jdbc:postgresql://xxx.xxx.xx.xx/xxxx
username: postgres
password:
driverClassName: org.postgresql.Driver
在多数据源的业务接口中使用@DSTransactional注解
主数据源是master,默认走mysql的库,在第二个数据源的service方法上,打上@DS注解
就会自动切换数据源,无论这两个sql哪一个失败,最终都会回滚。