文章目录
- 1、二阶段提交
-
- 第一阶段:表决阶段
- 第二阶段:执行阶段
- 2、Seata-AT模式
-
- (1)TC【事务协调器】
- (2)TM【事务管理器】
- (3)RM【资源管理器】
Seata
是一款开源的分布式事务解决方案的框架,它致力于在微服务架构下提供高性能和简单易用的分布式事务服务, Seata
为用户提供了 AT
、 TCC
、 SAGA
和 XA
事务模式。其中 AT
模式( auto transaction
)是一种无侵入的分布式事务解决方案, AT
模式的核心思想是基于二阶段提交实现的。
1、二阶段提交
两阶段提交协议(Two-Phase Commit
,2PC
)是一种分布式事务处理协议,目的是在确保多个分布式系统中执行的事务能够在所有参与者中保持一致性。2PC
协议通过将事务的提交过程分为两个阶段来实现确保即使在出现故障的情况下,也能保持数据的一致。2PC
的实现过程如下所示:
第一阶段:表决阶段
(1)事务协调者向所有参与者(Participants
)发送准备请求,询问它们是否能够提交事务
(2)每个参与者收到请求后,检查其本地的事务状态,确保它能够完成操作。如果参与者准备好提交,它会将其状态更改为“准备提交(Prepared
)”并返回一个“准备好”响应给协调者。如果无法提交,参与者会返回“拒绝”响应。
表决阶段中所有参与者都不会将数据更改持久化到数据库中,而是保留在一个临时状态。
第二阶段:执行阶段
(1)事务协调者收到了所有参与者的“准备好"响应,它会向所有参与者发送提交请求,告知参与者可以安全地将更改写入数据库
(2)参与者收到提交请求后,将更改持久化到数据库并返回提交确认给事务协调者。
(3)如果事务协调者收到所有参与者的提交确认,它会宣布事务提交成功。如果有任何参与者拒绝提交,协调者会发送回滚请求,要求所有参与者回滚之前的操作。
2PC
优点的具有简单易理解(协议流程较为简单,易于实现和理解)、保证数据的一致性(所有参与者对于事务的提交或回滚保持一致)。同时它的缺点也很明显,如阻塞(协调者崩溃时会导致参与者阻塞,无法继续处理事务)、性能问题(2PC
需要多次网络往返,可能影响性能)、故障恢复复杂(处理参与者或协调者崩溃后的恢复机制比较复杂)。
2、Seata-AT模式
Seata-AT
模式几个角色TC
、TM
、RM
,这几个角色的概念如下所示:
(1)TC【事务协调器】
它是独立的组件,需要独立部署运行,Seata
提供了这个独立运行的程序,它负责维护全局事务的运行状态,接收TM
指令发起全局事务的提交与回滚,负责与RM通信,协调各个分支事务的提交或回滚。
(2)TM【事务管理器】
TM
需要嵌入应用程序,它负责开启一个全局事务,并定义全局事务的范围,TM
目的是最终向TC
发起全局提交或回滚指令。
(3)RM【资源管理器】
RM
与TC
通信,控制分支事务,负责分支注册、报告分支事务状态,并接收事务协调器TC
的指令,命令分支事务完成本地事务的提交或回滚。
通过TC
、TM
、RM
的的相互协调配合实现了分布式事务的处理,Seata-AT
模式的实现原理图如下所示:
TM
负责定义全局事务的边界,然后向TC
申请开启一个全局事务,全局事务创建成功后会生成全局唯一的XID
,这个XID
会在微服务请求链路上下文中传播。
Seata-AT
模式的第一阶段的工作:
(1)通过拦截和解析业务sql
,然后根据解析sql
语句中的条件生成查询前的sql
语句,将查询结果当做快照后保存起来,后续如果事务回滚直接根据快照数据生成反向sql
进行回滚操作。
(2)Seata
实现了JDBC
协议,业务与数据库交互首先要经过Seata
,这样Seata
对sql
进行了拦截与处理,处理完成后将sql
发送到真实数据库执行。
由于上述操作在同一个本地事务中,那么数据库的事务特性保证数据的一致性。
Seata-AT
模式的第二阶段工作:
对于AT
模式,二阶段提交主要是将每个事务的参与者的快照数据删除,同时释放行锁;如果回滚,利用快照数据执行回滚。
在AT
模式中,需要使用Seata
组件中的JDBC
代理数据源DataSourceProxy
,实现对真正目标数据源的代理访问,通过代理实现拦截、解析sql
的执行来实现快照数据的保存,如果业务执行成功,那么就删除快照数据,如果业务执行失败就使用快照回滚。