硬核!2w 字长文爆肝分布式事务知识点!! (4)

完成事务:协调者接收到所有参与者反馈的 Ack 消息后,完成事务。 2.中断事务(假设有任何参与者反馈了 no 响应,或者超时了,就中断事务)

发送中断请求:协调者向所有的参与者节点发送 abort 请求。

事务回滚:参与者接收到 abort 请求后,会利用其在二阶段记录的 undo 信息来执行事务回滚操作,并在完成回滚之后释放整个事务执行期间占用的资源。

反馈事务回滚结果:参与者在完成事务回滚之后,想协调者发送 Ack 消息。

中断事务:协调者接收到所有的 Ack 消息后,中断事务。

2.3.4与 2pc 的区别

注意:在阶段三,可能会出现 2 种故障:协调者出现问题/协调者和参与者之间的网络故障一段出现了任一一种情况,最终都会导致参与者无法收到 doCommit 请求或者 abort 请求, 针对这种情况,参与者都会在等待超时之后,继续进行事务提交。

优点

相比较 2PC,最大的优点是减少了参与者的阻塞范围(第一个阶段是不阻塞的),并且能够在单点故障后继续达成一致(2PC 在提交阶段会出现此问题,而 3PC 会根据协调者的状态进行回滚或者提交)。

缺点

如果参与者收到了 preCommit 消息后,出现了网络分区,那么参与者等待超时后,都会进行事务的提交,这必然会出现事务不一致的问题。

2.4 TCC 方案

TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其业务逻辑对应的确认和补偿(撤销)操作。

其将整个业务逻辑的每个分支显式的分成了 Try、Confirm、Cancel 三个操作。Try 部分完成业务的准备工作,confirm 部分完成业务的提交,cancel 部分完成事务的回滚。

在这里插入图片描述

优点:跟 2PC 比起来,实现以及流程相对简单了一些,但数据的一致性比 2PC 也要差一些

缺点:TCC 属于应用层的一种补偿方式,所以需要程序员在实现的时候多写很多补偿的代码,而且补偿的时候也有可能失败,在一些场景中,一些业务流程可能用TCC 不太好定义及处理。

2.5 MQ(事务消息)

目前,仅阿里云的RocketMQ 支持事务消息。帮助用户实现类似 X/Open XA 的分布事务功能,通过 MQ 事务消息能达到分布式事务的最终一致。

在这里插入图片描述

说明

发送方向 MQ 服务端发送消息

MQ Server 将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息

发送方开始执行本地事务逻辑

发送方根据本地事务执行结果向 MQ Server 提交二次确认(Commit 或是 Rollback),MQ Server 收到 Commit 状态则将半消息标记为可投递,订阅方最终将收到该消息;MQ Server 收到 Rollback 状态则删除半消息,订阅方将不会接受该消息

在断网或者是应用重启的特殊情况下,上述步骤 4 提交的二次确认最终未到达 MQ Server,经过固定时间后 MQ Server 将对该消息发起消息回查

发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果

发送方根据检查得到的本地事务的最终状态再次提交二次确认,MQ Server 仍按照步骤 4 对半消息进行操作

其中,事务消息发送对应步骤 1、2、3、4,事务消息回查对应步骤 5、6、7

2.6 Lcn 事务 2.6.1 背景

LCN 名称是由早期版本的 LCN 框架命名,在设计框架之初的 1.0 ~ 2.0 的版本时框架设计的步骤是如下,各取其首字母得来的LCN 命名。

锁定事务单元(lock)

确认事务模块状态(confirm)

通知事务(notify)

2.6.2框架定位

LCN 并不生产事务,LCN 只是本地事务的协调工,TX-LCN 定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果

2.6.3事务控制原理

TX-LCN 由两大模块组成, TxClient、TxManager

TxClient 作为模块的依赖框架,提供 TX-LCN 的标准支持

TxManager 作为分布式事务的控制方。事务发起方或者参与反都由TxClient 端来控制。

原理图

在这里插入图片描述

1.创建事务组:是指在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象,然后拿到事务标示 GroupId 的过程。

2.加入事务组:添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给 TxManager 的操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxwzf.html