分布式事务seata之AT与TCC模型

1. seata分布式事务简介

seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。

Seata提供了AT、TCC、SAGA和XA事务模型,为用户打造一站式的分布式解决方案。

简单来说,Seata就是针对主流事务解决方案的封装,我们直接使用Seata这个框架就可以选择性的使用不同的事务模型来解决分布式事务问题。

2. seata中的AT事务模型

AT模式实际上是2PC协议的一种演变方式,也是通过两个阶段的提交或者回滚来保证多节点事务的一致性,它的工作模型如下图所示。

具体工作流程说明如下:

 1. 第一阶段, 应用系统会把一个业务数据的事务操作和回滚日志记录在同一个本地事务中提交,在提交之前,会向TC(seata server)注册事务分支,并申请针对本次事务操作的表的全局锁。 接着提交本地事务,本地事务会提交业务数据的事务操作以及UNDO LOG,放在一个事务中提交。

2. 第二个阶段,这一个阶段会根据参与到同一个XID下所有事务分支在第一个阶段的执行结果来决定事务的提交或者回滚,这个回滚或者提交是TC来决定的,它会告诉当前XID下的所有事务分支,提交或者回滚。
  • 如果是提交, 则把提交请求放入到一个异步任务队列,并且马上返回提交成功给到TC,这样可以避免阻塞问题。而这个异步任务,只 需要删除UNDO LOG就行,因为原本的事务已经提交了。
  • 如果是回滚,则开启一个本地事务,执行以下操作
    • 通过XID和Branch ID查找到响应的UNDO LOG记录
    • 数据校验,拿到UNDO LOG中after image(修改之后的数据)和当前数据进行比较,如果有不同,说明数据被当前全局 事务之外的动作做了修改,这种情况需要根据配置策略来做处理。
    • 根据UNDO LOG中的before image和业务SQL的相关信息生成并执行回滚语句
    • 提交本地事务,并把本地事务的执行结果上报给TC

 2.1 AT模式原理详解

假设存在一个业务表product,表结构如下:

Field Type Key
id bigint(20) PRI
name varchar(100)
since varchar(100)

这个表中,有一条对应的数据:

id name since
1 TXC 2024

 假设AT模式下的其中一个分支事务的执行业务逻辑对应的sql语句如下:

update product set name = 'GTS' where name = 'TXC';

 在Seata的AT模式下,执行的过程如下:

AT模式第一阶段

这个阶段主要分为两个过程。

  1. 执行数据的修改
  2. 记录回滚日志

具体过程如下:

1. 解析前面的 Update 语句,得到SQL类型(UPDATE)、表(Product)、条件(where name ='TXC')等相关信息。
2. 根据解析到的条件信息,生成一条查询语句用来查询修改之前的数据状态
select id , name , since from product where name = 'TXC'<
### 分布式事务 Seata 工作原理 #### 1. 架构组件介绍 Seata 的架构主要由三个核心部分组成: - **Transaction Coordinator (TC)**:作为独立部署的服务端,负责维护全局事务的运行状态以及管理分支事务的状态报告和提交/回滚指令[^4]。 - **Transaction Manager (TM)**:位于应用程序内部,用于定义全局事务范围并发起全局提交或回滚命令给 TC。当 TM 启动一个新的全局事务时,会从 TC 获取唯一的 XID(全局唯一事务 ID),并将此 XID 注入到后续所有的本地事务执行上下文中。 - **Resource Manager (RM)**:同样内置于应用侧,充当着数据库或其他持久化存储系统的代理角色。RM 接收来自 TM 或者 TC 发送过来的消息来决定是否要对某个具体的分支事务实施确认还是取消操作。 #### 2. 支持的模式解析 ##### TCC 模式 TCC 模式的全称为 Try-Confirm-Cancel,在这种模式下,开发者需要针对每一个参分布式事务的数据源提供三种接口函数——`Try()`、`Confirm()` 和 `Cancel()`. - `Confirm`: 正式完成业务逻辑变更的过程,通常情况下不需要额外编写代码因为一旦进入这一步就意味着前面所有准备工作都已经顺利完成; - `Cancel`: 当整个流程出现问题时用来清理之前所做的预备工作,即解除锁住的商品以便它们可以重新回到可售状态[^3]. ```java public interface BusinessAction { boolean prepare(); // 对应Try() void commit(); // 对应Confirm(), 可能为空实现 void rollback(); // 对应Cancel() } ``` ##### AT 模式 AT 即 Automatic Transaction Mode 自动化事务模式,它允许开发人员像平常那样写 SQL 语句而无需关心底层如何处理分布式一致性问题。通过拦截器机制自动识别出哪些数据表受到了影响从而自动生成对应的 undo_log 表记录原始值的变化情况。如果最终能够正常结束,则删除这条日志条目;反之则利用该信息来进行回滚恢复原状. ##### Saga 模式 Saga 流程是由一系列补偿性子事务构成的一个长活事务模型。每个参者只关注自己那部分工作的正向执行路径及其相应的逆向修复措施。这种方式虽然简单易懂但也存在局限性,特别是在面对高并发访问相同资源的情形时可能会遇到挑战,而且某些特定类型的业务很难找到合适的办法去设计有效的补偿行为[^1]. #### 3. 总结 综上所述,Seata 提供了一套完整的解决方案帮助构建可靠高效的微服务体系下的跨服务调用场景中的数据一致性和可靠性保障能力。不同的应用场景可以根据实际需求选择最适合自己的模式组合使用以达到最佳效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值