自己个人的网站怎么设计,建设网站选什么地方的主机,上海网站关键词排名优化报价,网站建设的必要性导航一、Seata 介绍二、Seata 的工作原理2.1 三个角色2.2 工作流程三、Seata AT 工作机制3.1 一阶段3.2 二阶段四、案例演示#xff08;待补充#xff09;一、Seata 介绍
官网#xff1a;Seata 官网
Seata 是2019 年阿里巴巴中间件团队发起的开源项目#xff0c;其前身是…
导航一、Seata 介绍二、Seata 的工作原理2.1 三个角色2.2 工作流程三、Seata AT 工作机制3.1 一阶段3.2 二阶段四、案例演示待补充一、Seata 介绍
官网Seata 官网
Seata 是2019 年阿里巴巴中间件团队发起的开源项目其前身是 FescarFast EaSy Commit And Rollback。其愿景是让分布式的使用像本地事务的使用一样简单、高效并逐步解决开发者遇到的分布式事务方面的所有难题。
Seata 意为 Simple Extensible Autonomous Transaction Architecture简单可扩展自治分布式框架。
Seata 的设计目标是对业务无侵入因此从业务无侵入的 2PC 方案入手在传统 2PC 的基础上扩展把一个分布式事务理解成一个包含若干分支事务的全局事务
二、Seata 的工作原理
2.1 三个角色
1、TCTransaction Coordinator 事务协调器管理全局的分支事务状态用于全局性事务的提交和回滚。 2、TMTransaction Manager 事务管理器用于开启、提交或回滚全局事务。 3、RMResource Manager 资源管理器用于分支事务上的资源管理向 TC 注册分支事务上报分支事务的状态接收 TC 的命令来提交或回滚分支事务。
2.2 工作流程
假设上图中的三个服务根据调用关系为 A– B–C那么 Seata 的执行流程如下 1、A 服务的TM 向TC申请开启一个全局事务TC会创建一个全局事务并返回一个 唯一的 XID。 2、A 服务的 RM向 TC注册分支事务并将其纳入 XID 对应全局事务的管辖。 3、A 服务执行分支事务操作数据库。 4、A 服务开始远程调用 B 服务此时XID 会在微服务的调用链上传播。 5、B 服务的 RM 向TC 注册分支事务并将其纳入 XID 对应的全局事务的管辖。 6、B 服务执行分支事务操作数据库。 7、全局事务调用链处理完毕TM 根据有无异常向 TC 发起全局事务的提交或回滚。 8、TC 协调其管辖下的所有分支事务决定是否回滚。 Seata 实现 2PC 与传统 2PC 的区别 1、架构层次方面传统 2PC 方案的 RM 实际上是在数据库层RM 本质就是数据库通过 XA 协议实现而 Seata 的 RM 是以 jar 包的形式作为中间件层部署在应用程序这一侧的。 2、两阶段提交方面传统 2PC 无论第二阶段的决议是 commit 还是 rollback 事务性资源的锁都要保持到 Phase 2 完成才释放。而 Seata 的做法是在 Phase 1 就将本地事务提交这样就可以省去 Phase 2 持锁的时间整体提高效率。 三、Seata AT 工作机制
Seata 在 2PC 提交模型的基础上进行了演进视为 Seata AT 模式。除此之外还有 Seata TCC模式、Seata XA 模式等。
Seata AT 模式非常简单也是两阶段提交。
一阶段业务数据和回滚日志记录在同一个本地事务中提交释放本地锁和连接资源。二阶段- 异步提交快速完成- 回滚通过一阶段回滚日志进行反向补偿。
下面以一个简单示例说明整体 AT 模式的工作机制参考原文Seata AT 模式
3.1 一阶段
商品表product
FieldTypeKeyidbigint(20)PRInamevarchar(100)sincevarchar(100)
业务逻辑
update product set name GTS where name TXC;1、解析SQL得到 Sql 类型update表product条件等信息。 2、查询前镜像根据解析得到的条件生成查询语句定位数据
select id, name, since from product where name TXC;idnamesince1TXC2014
3、执行业务 SQL更新这条记录的 name 为 ‘GTS’。 4、查询后镜像根据前镜像的结果通过 主键 定位数据。
select id, name, since from product where id 1;idnamesince1GTS2014
5、插入回滚日志把前后镜像数据以及业务 SQL 相关的信息组成一条回滚日志记录插入到 UNDO_LOG 表中。
{branchId: 641789253,undoItems: [{afterImage: {rows: [{fields: [{name: id,type: 4,value: 1}, {name: name,type: 12,value: GTS}, {name: since,type: 12,value: 2014}]}],tableName: product},beforeImage: {rows: [{fields: [{name: id,type: 4,value: 1}, {name: name,type: 12,value: TXC}, {name: since,type: 12,value: 2014}]}],tableName: product},sqlType: UPDATE}],xid: xid:xxx
}6、提交前向 TC 注册分支申请 product 表中主键值等于 1 的记录的 全局锁 。 7、本地事务提交业务数据的更新和前面步骤中生成的 UNDO LOG 一并提交。 8、将本地事务提交的结果上报给 TC。
3.2 二阶段
回滚 1、收到 TC 的分支回滚请求开启一个本地事务执行如下操作。 2、通过 XID 和 Branch ID 查找到相应的 UNDO LOG 记录。 3、数据校验拿 UNDO LOG 中的后镜与当前数据进行比较如果有不同说明数据被当前全局事务之外的动作做了修改。这种情况需要根据配置策略来做处理详细的说明在另外的文档中介绍。 4、根据 UNDO LOG 中的前镜像和业务 SQL 的相关信息生成并执行回滚的语句
update product set name TXC where id 1;5、提交本地事务。并把本地事务的执行结果即分支事务回滚的结果上报给 TC。
提交 1、收到 TC 的分支提交请求把请求放入一个异步任务的队列中马上返回提交成功的结果给 TC。 2、异步任务阶段的分支提交请求将异步和批量地删除相应 UNDO LOG 记录。
四、案例演示待补充
演示一个电商下订单扣库存的应用案例看下 Seata 是如何使用的。