Seata

分布式事务相关概念

1、事务:由一组操作构成的可靠、独立的工作单元,事务具备 ACID 的特性,即原子性、一致性、隔离性、持久性

2、本地事务:本地事务由本地资源管理器(通常指数据库管理系统 DBMS,例如 MySQL、Oracle 等)管理,严格地支持 ACID 特性,高效可靠。本地事务不具备分布式事务的处理能力,隔离的最小单位受限于资源管理器,即本地事务只能对自己数据库的操作进行控制,对于其他数据库的操作则无能为力

3、全局事务:全局事务指的是一次性操作多个资源管理器完成的事务,由一组分支事务组成

4、分支事务:在分布式事务中,就是一个个受全局事务管辖和协调的本地事务

5、可以将分布式事务理解成一个包含了若干个分支事务的全局事务。全局事务的职责是协调其管辖的各个分支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个满足 ACID 特性的本地事务

 

Seata 术语

1、TC(Transaction Coordinator)- 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚

2、TM(Transaction Manager)- 事务管理器:定义全局事务的范围,开始全局事务、提交或回滚全局事务

3、RM(Resource Manager)- 资源管理器:管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚

4、XID:全局事务的唯一标识,它可以在服务的调用链路中传递,绑定到服务的事务上下文中

5、TC 以 Seata 服务器(Server)形式独立部署,TM 和 RM 则是以 Seata Client 的形式集成在微服务中运行

 

Seata 的整体工作流程如下

1、TM 向 TC 申请开启一个全局事务,全局事务创建成功后,TC 会针对这个全局事务生成一个全局唯一的 XID

2、XID 通过服务的调用链传递到其他服务

3、RM 向 TC 注册一个分支事务,并将其纳入 XID 对应全局事务的管辖

4、TM 根据 TC 收集的各个分支事务的执行结果,向 TC 发起全局事务提交或回滚决议

5、TC 调度 XID 下管辖的所有分支事务完成提交或回滚操作

只需要使用一个 @GlobalTransactional 注解在业务方法上

 

Seata AT 模式

1、一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁、连接资源

2、二阶段

(1)提交异步化,非常快速地完成

(2)回滚通过一阶段的回滚日志进行反向补偿

 

一阶段

1、解析 SQL:得到 SQL 的类型、表、条件等相关的信息

2、查询前镜像:根据解析得到的条件信息,生成查询语句,定位数据

3、执行业务 SQL

4、查询后镜像:根据前镜像的结果,通过主键定位数据

5、插入回滚日志:把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录,插入到 UNDO_LOG 表中

6、提交前,RM 向 TC 注册分支,生成行锁

7、本地事务提交:业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交

8、将本地事务提交的结果上报给 TC

 

二阶段-回滚

1、收到 TC 的分支回滚请求,开启一个本地事务,执行如下操作

2、通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录

3、数据校验:拿 UNDO LOG 中的后镜与当前数据进行比较,如果有不同,说明数据被当前全局事务之外的动作做了修改。这种情况,需要根据配置策略来做处理

4、根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句

5、提交本地事务。并把本地事务的执行结果(即分支事务回滚的结果)上报给 TC

 

二阶段-提交

1、收到 TC 的分支提交请求,把请求放入一个异步任务的队列中,马上返回提交成功的结果给 TC

2、异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录

posted @   半条咸鱼  阅读(89)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示