实战 Seata:实现分布式事务解决方案
实战 Seata:实现分布式事务解决方案
学习”黑马程序员SpringCloud微服务开发与实战,java黑马商城项目微服务实战开发“笔记记录
一、部署TC服务
Seata 中的 TC(事务协调器)是整个分布式事务的核心组件,用于管理全局事务的生命周期。我们可以通过多种方式部署 TC,这里我们推荐使用 Docker 方式部署。
1️⃣准备数据库表
Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。
-- 创建 Seata 所需数据库表(MySQL 示例)
CREATE DATABASE seata;USE seata;-- 全局事务表
CREATE TABLE `global_table` (`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`status` TINYINT NOT NULL,...PRIMARY KEY (`xid`)
);-- 分支事务表
CREATE TABLE `branch_table` (...
);-- undo_log 表(服务端与客户端都要用)
CREATE TABLE `undo_log` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT,`branch_id` BIGINT(20) NOT NULL,`xid` VARCHAR(100) NOT NULL,...PRIMARY KEY (`id`),UNIQUE KEY (`xid`, `branch_id`)
);
2️⃣准备配置文件
- 下载 Seata Server(GitHub Releases)
- 解压后修改以下配置:
application.yml
:
server:port: 7099spring:application:name: seata-serverseata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: nacos:8848group : "DEFAULT_GROUP"namespace: ""dataId: "seataServer.properties"username: "nacos"password: "nacos"registry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: nacos:8848group : "DEFAULT_GROUP"namespace: "f923fb34-cb0a-4c06-8fca-ad61ea61a3f0"username: "nacos"password: "nacos"
- 配置数据库连接:
store:# support: file 、 db 、 redismode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://mysql:3306/seata?rewriteBatchedStatements=trueuser: rootpassword: 123min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000redis:mode: singledatabase: 0min-conn: 10max-conn: 100password:max-total: 100query-limit: 1000single:host: 192.168.150.101port: 6379
3️⃣Docker 部署 Seata Server
docker run -d --name seata-server \-p 8099:8099 \-p 7099:7099 \-e SEATA_IP=192.168.184.101 \-e SEATA_PORT=8091 \-v /your/path/registry.conf:/seata-server/resources/registry.conf \-v /your/path/file.conf:/seata-server/resources/file.conf \seataio/seata-server:1.7.0
二、微服务集成 Seata
1️⃣引入依赖
以 Nacos 为注册中心、MySQL 数据库为例:
<!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
2️⃣改造配置
首先在nacos
上添加一个共享的seata配置,命名为shared-seata.yaml
:
seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.184.101:8848 # nacos地址namespace: "" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: "default"
在各个服务模块,添加bootstrap.yaml
:
- dataId: shared-seata.yaml # 共享seata配置
加载共享的seata配置
3️⃣添加数据库表
所有参与分布式事务的数据库都必须有 undo_log
表,支持 Seata
自动回滚。
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 = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
4️⃣使用
在业务服务中,通过注解控制事务:
@GlobalTransactional
在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。