分布式事务Seata使用及原理

Steata是一个开源的分布式事务服务,提供AT、TCC、SAGA和XA等多种事务模式。它包括TC(事务协调者)、TM(事务管理器)和RM(资源管理器)三个角色。2PC两阶段提交协议是这些解决方案的基础,但存在同步阻塞、单点故障和数据不一致等问题。AT模式是无侵入的,而TCC模式需要用户自定义Try、Confirm和Cancel操作,具有更高的性能但侵入性强。SeataServer的环境搭建可选择file、db或redis存储模式。

一、什么是Steata

Steata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务,Steata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案,AT模式是阿里首推的模式,阿里云上用商用版的GTS

二、Setata的三大角色

在Seate的架构中,一共有三个角色:

TC:事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM:事务管理器

定义全局事务的范围:开启全局事务、提交或回滚全局事务

RM:资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TC为单独部署的Seata服务端,TM和RM为嵌入到应用中的Client客户端

三、常见的分布式事务解决方案

1、seata阿里云分布式事务框架

2、消息队列

3.saga

4.XA

他们有一个共同点,都是“两阶段(2PC)"。“两阶段”是指完成整个分布式事务,划分成两个步骤完成。实际上,这四种常见的分布式事务解决方案,分别对应着分布式事务的四种模式: AT、TCC、Saga、XA;四种分布式事务模式,都有各自的理论基础,分别在不同的时间被提出;每种模式都有它的适用场景,同样每个模式也都诞生有各自的代表产品;而这些代表今天,我们会分别来看4种模式(AT、TCC、 Saga、 XA)的分布式事务实现。产品,可能就是我们常见的(全局事务、基于可靠消息、最大努力通知、TCC)。在看具体实现之前,先讲下分布式事务的理论基础。

四、2PC两阶段提交协议

2PC(两阶段提交,Two-Phase Commit)

简单的来说,分为两个阶段:Prepare和commit

Prepare:提交事务请求

2PC的问题

1.同步阻塞参与者在等待协调者的指令时,其实是在等待其他参与者的响应,在此过程中,参与者是无法进行其他操作的,也就是阻塞了其运行。倘若参与者与协调者之间网1络异常导致参与者一直收不到协调者信息,那么会导致参与者一直阻塞下去。

2.单点在2PC中,一切请求都来自协调者,所以协调者的地位是至关重要的,如果协调者宕机,那么就会使参与者一直阻塞并一直占用事务资源。

如果协调者也是分布式,使用选主方式提供服务,那么在一个协调者挂掉后,可以选取另一个协调者继续后续的服务,可以解决单点问题。但是,新协调者无法知道上一个事务的全部状态信息(例如已等待 Prepare 响应的时长等),所以也无法顺利处理上一个事务。

3,数据不一致Commit事务过程中Commit请求/Rollback请求可能因为协调者宕机或协调者与参与者网络问题丢失,那么就导致了部分参与者没有收到Commit/Rollback请求,而其他参与者则正常收到执行了Commit/Rollback操作,没有收到请求的参与者则继续阻塞。这时,参与者之间的数据就不再一致了。当参与者执行Commit/Rollback后会向协调者发送Ack,然而协调者不论是否收到所有的参与者的Ack,该事务也不会再有其他补救措施了,协调者能做的也就是等待超时后像事务发起者返回一个“我不确定该事务是否成功”。

五、AT模式(auto transcation(自动提交事务))

AT模式是一种无侵入的分布式事务解决方案。在AT模式下,用户只需关注自己的”业务SQL“,用户的”业务SQL“作为一阶段,Seata框架会自动生成事务的二阶段提交和回滚操作。

第一阶段:在第一阶段,Seata会拦截“业务SQL”,首先解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据要被更新前,将其保存成“before image” ,然后执行“业务SQL“更新业务数据,在业务数据更新之后,,将其保存成”after image“,最后生成行锁,以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

第二阶段:

二阶段如果是提交的话,因为“业务SQL”在第一阶段已经提交到数据库,所以Seata框架只需将一阶段保存的快照数据和行锁删除掉,完成数据清理即可

二级段的回滚:

二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的的“业务SQL”,还原业务数据,回滚方式,便是用“before image”,还原业务数据,但在还原前要首先要校验脏写,对比数据库当前业务数据和“after image”,如果两份数据完全一致就说明没有脏写,可以还原数据,如果不一致,说明有脏写,出现脏写就需要转人工处理。

六、TCC模式

TCC模式需要用户根据自己的业务场景实现Try、Confirm和Cancel,三个操作,事务发起放在一阶段执行Try方式,在二阶段提交执行Confirm方法,二阶段回滚执行Cancel方法。

缺点:侵入性比较强,并且得自己实现相关事务控制逻辑

优点:在整个过程基本没有锁,性能更强

七、Seata Server(TC) 环境搭建

Server端存储模式(store.mode)支持三种:

1.file:单击模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高(默认)

2.db:高可用模式,全局事务会话信息通过db共享,相应性能差些,

3.redis:Seata-Server1.3及以上版本支持,性能较高,存在事务信息丢失情况,请提前配置适合当前场景的Redis持久化配置

等待后续更新

### 分布式事务 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、付费专栏及课程。

余额充值