Spring Cloud Alibaba Seata 分布式事务(六)
目录
一 基础概念
二 介绍
二 实际使用
1 找到对应的文件
2 打开bin 目录
3 开启终端
4 可视化界面
四 二阶提交协议流程
(1)一阶段:准备阶段(Prepare)
(2)二阶段:提交或回滚阶段(Commit / Rollback)
一 基础概念
特性 | 描述 |
---|---|
目标 | 解决微服务架构下的数据一致性问题 |
核心角色 | TC(协调器)、TM(管理器)、RM(资源管理器) |
主流模式 | AT 模式(无侵入、自动补偿)、TCC模式(高性能、需编码) |
使用方式 | 1. 部署Seata-Server;2. 添加依赖;3. 使用@GlobalTransactional 注解 |
优势 | 对代码侵入性低(AT模式),与Spring Cloud Alibaba生态(Nacos, Sentinel)无缝集成,提供了多种模式适应不同场景 |
简单来说,Seata 通过一个简单的注解和一套巧妙的“回滚日志”机制,帮你透明地解决了最令人头疼的分布式事务问题,是你构建微服务系统时非常值得考虑的基础组件。
二 介绍
Seata的架构包括三个核心角色
TM = 事务发起人,RM = 事务执行者,TC = 总裁判/协调者。
TC (Transaction Coordinator) - 事务协调器:维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM (Transaction Manager) - 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务。
RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
二 实际使用
Seata-Server Release History | Apache Seata
1 找到对应的文件
2 打开bin 目录
3 开启终端
使用管理员身份开启终端
./seata-server.bat
4 可视化界面
账号密码都是seata
依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2023.0.3.2</version></dependency>
导入成功
配置文件:
transport {# tcp udt unix-domain-sockettype = "TCP"#NIO NATIVEserver = "NIO"#enable heartbeatheartbeat = true# the client batch send request enableenableClientBatchSendRequest = true#thread factory for nettythreadFactory {bossThreadPrefix = "NettyBoss"workerThreadPrefix = "NettyServerNIOWorker"serverExecutorThread-prefix = "NettyServerBizHandler"shareBossWorker = falseclientSelectorThreadPrefix = "NettyClientSelector"clientSelectorThreadSize = 1clientWorkerThreadPrefix = "NettyClientWorkerThread"# netty boss thread size,will not be used for UDTbossThreadSize = 1#auto default pin or 8workerThreadSize = "default"}shutdown {# when destroy server, wait secondswait = 3}serialization = "seata"compressor = "none"
}
service {#transaction service group mappingvgroup_mapping.tx = "default"#only support when registry.type=file, please don't set multiple addressesdefault.grouplist = "127.0.0.1:8091"#degrade, current not supportenableDegrade = false#disable seatadisableGlobalTransaction = false
}client {rm {asyncCommitBufferLimit = 10000lock {retryInterval = 10retryTimes = 30retryPolicyBranchRollbackOnConflict = true}reportRetryCount = 5tableMetaCheckEnable = falsereportSuccessEnable = false}tm {commitRetryCount = 5rollbackRetryCount = 5}undo {dataValidation = truelogSerialization = "jackson"logTable = "undo_log"}log {exceptionRate = 100}
}
注解:@GlobalTransacyional
@SentinelResource(value = "createOrder", blockHandler = "createOrderFallback")@GlobalTransactional@Overridepublic Order createOrder(Long productId, Long userId) {// Product product = getProductFromRemote3(productId);Product product = productFeignClient.getProductById(productId);Order order = new Order();order.setId(1L);// 远程调用计算商品数额order.setTotalAmount(product.getPrice().multiply(new BigDecimal(product.getNum())));order.setUserId(userId);order.setNickName("张三");order.setAddress("青岛");// 远程调用获取商品信息order.setProductList(Arrays.asList(product));return order;}
四 二阶提交协议流程
Seata 的 2PC 协议流程
(1)一阶段:准备阶段(Prepare)
-
TM(事务管理器) 发起一个全局事务请求,向 TC(事务协调器) 注册一个 全局事务 ID(XID)。
-
业务服务在调用时,RM(资源管理器) 会向 TC 注册分支事务。
-
每个分支事务在本地数据库中执行 业务 SQL,但 不会真正提交,而是:
-
把 前镜像(before image) 和 后镜像(after image) 保存到 undo_log 表,用于回滚时恢复。
-
把执行结果(是否成功)上报给 TC。
-
阶段一的目标:锁定资源(行锁)+ 保证可回滚。此时业务 SQL 已经执行,但结果还没对外可见(本地事务未提交)。
(2)二阶段:提交或回滚阶段(Commit / Rollback)
-
TC 收到所有 RM 的反馈后:
-
如果所有分支事务都成功 → 发出 Commit 请求
-
RM 删除对应的
undo_log
日志。 -
本地事务提交,数据正式生效。
-
-
如果有一个分支事务失败 → 发出 Rollback 请求
-
RM 根据
undo_log
的 before image 回滚数据。 -
释放锁资源,事务一致性恢复。
-
-
阶段二的目标:根据全局事务状态,最终决定各分支事务是 提交 还是 回滚。