seata整合多資料源
- 一、背景
- 二、整合步驟
-
- 1、seata server的搭建
- 2、引入資料源切換元件
- 3、引入seata元件
- 4、配置多資料源
- 5、關閉seata自己預設的資料源代理
- 6、配置seata事物分組
- 7、業務庫建立undo_log表
- 8、xid的傳遞
- 9、代碼中使用資料源切換
- 10、業務方法開啟分布式事物
- 三、注意事項
- 四、完整代碼
在這篇文章中,我們使用
Seata
整合一下多資料源的場景。多資料源切換的功能我們使用
dynamic-datasource-spring-boot-starter
來完成,并且這個元件還可以和
Seata
進行整合,實作資料源的代理。
此篇文章 依賴之前的 seata整合nacos完成分布式的部署
seata整合nacos完成分布式的部署
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
<!-- 此處seata的注冊中心和配置中心使用的都是nacos,索引需要引入這個 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.2</version>
</dependency>
- 此處配置2個資料源,account和order并且設定和 seata進行整合
- 需要注冊此切面的位置
- 設定預設的資料源
spring:
datasource:
dynamic:
# 啟用 seata
seata: true
# 模式是 at 模式
seata-mode: at
# 主資料源是 account 資料源
primary: account
# 不啟用嚴格模式
strict: false
# 配置資料源切面的位置
order: "-2147483648"
# 每一個資料源
datasource:
# account 庫的資料源
account:
url: jdbc:mysql://127.0.0.1:3306/seata_account?useUnicode=true&characterEncoding=utf8&autoReconnectForPools=true&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 訂單庫的資料源
order:
url: jdbc:mysql://127.0.0.1:3306/seata_order?useUnicode=true&characterEncoding=utf8&autoReconnectForPools=true&useSSL=false
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
seata:
# 是否自動開啟資料源代理
enable-auto-data-source-proxy: false
seata:
enabled: true
tx-service-group: tx_multiple_datasource_group
# 該分組需要在seata server的配置中心中存在,即在 seata server 的配置中心中需要存在service.vgroupMapping.tx_multiple_datasource_group 配置項
CREATE TABLE IF NOT EXISTS `undo_log`
(
`branch_id` BIGINT NOT NULL COMMENT 'branch transaction id',
`xid` VARCHAR(128) NOT NULL COMMENT 'global transaction id',
`context` VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',
`rollback_info` LONGBLOB NOT NULL COMMENT 'rollback info',
`log_status` INT(11) NOT NULL COMMENT '0:normal status,1:defense status',
`log_created` DATETIME(6) NOT NULL COMMENT 'create datetime',
`log_modified` DATETIME(6) NOT NULL COMMENT 'modify datetime',
UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
) ENGINE = InnoDB COMMENT ='AT transaction mode undo table';
到此就整合完了。
1、開啟事物,是需要擷取一個資料庫連接配接的,那麼我們的
@DS
注解切換資料源必須要在
@Transaction
之前執行。
https://gitee.com/huan1993/spring-cloud-parent/tree/master/seata/seata-multiple-datasource