前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式事务-Seata

分布式事务-Seata

原创
作者头像
Get
修改2024-04-14 15:13:58
110
修改2024-04-14 15:13:58

Seata:

代码语言:java
复制
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案
1、对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
2、高性能:减少分布式事务解决方案所带来的性能消耗

Seata 组成的三个重要组件:
1、TC(TransactionCoordinator):事务协调者。管理全局的分支事务的状态,用于全局性事务的提交和回滚。
2、TM(TransactionManager):    事务管理者。用于开启、提交或回滚全局事务的决议。
3、RM(ResourceManager):       资源管理器。控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
TM(全局) -- TC(居中协调) -- RM(分支、局部)

UNDO_LOG:seata框架"为每一个 RM 维护了一张undo_log表",其中"保存了每一次本地事务的回滚数据"。

AT模式:

代码语言:java
复制
AT 模式的特点:对业务无入侵式,整体机制分二阶段提交(2PC)
在 AT 模式下,用户只需关注自己的业务SQL(用户的业务SQL 作为一阶段),Seata 框架会自动生成事务的一、二阶段提交和回滚操作。
AT 模式是一种对业务无任何侵入的分布式事务解决方案。

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
二阶段:提交异步化,非常快速地完成
       回滚通过一阶段的回滚日志进行反向补偿。

一个典型的分布式事务过程:
1、TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID;
2、XID 在微服务调用链路的上下文中传播;
3、RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖;
4、TM 向 TC 发起针对 XID 的全局提交或回滚决议 (根据所有RM反馈的状态发起提交或回滚决议);
5、TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。       
clipboard.png
clipboard.png
代码语言:java
复制
AT模式原理分析:"AT模式最大的优点就是对业务代码无侵入,一切都像在写单体业务逻辑一样"
TC 相关的三张表:
1、global_table:全局事务表,每当有一个全局事务发起后,就会在该表中记录全局事务的ID
2、branch_table:分支事务表,记录每一个分支事务的ID,分支事务操作的哪个数据库等信息
3、lock_table:全局锁

一阶段步骤:

代码语言:java
复制
1、TM:seata-order.create()方法执行时,由于该方法具有@GlobalTranscational标志,该 TM 会向 TC 发起全局事务,生成 XID(全局锁)
2、RM:StorageService.deduct():写表,UNDO_LOG 记录回滚日志(Branch ID),通知 TC 操作结果
3、RM:AccountService.deduct():写表,UNDO_LOG 记录回滚日志(Branch ID),通知 TC 操作结果
4、RM:OrderService.create():写表,UNDO_LOG 记录回滚日志(Branch ID),通知 TC 操作结果
RM 写表的过程,Seata 会拦截业务SQL,首先解析 SQL 语义,
在业务数据被更新前,将其保存成before image(前置镜像),然后执行业务SQL,
在业务数据更新之后,再将其保存成after image(后置镜像),最后生成行锁。
以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
clipboard.png
clipboard.png

二阶段步骤:

代码语言:java
复制
因为 “业务 SQL” 在一阶段已经提交至数据库, 所以 Seata 框架只需将一阶段保存的快照数据和行锁删掉,完成数据清理即可。

正常:TM执行成功,通知TC全局提交,TC此时通知所有的RM提交成功,删除UNDO_LOG回滚日志
clipboard.png
clipboard.png
代码语言:java
复制
异常:TM执行失败,通知TC全局回滚,TC此时通知所有的RM进行回滚,
     根据UNDO_LOG反向操作,使用before image还原业务数据,删除UNDO_LOG,
     但在还原前要首先要校验脏写,对比 "数据库当前业务数据" 和 "after image",
     如果两份数据完全一致就说明没有脏写,可以还原业务数据,
     如果不一致就说明有脏写,出现脏写就需要转人工处理。

clipboard.png
clipboard.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档