首页 > 架构设计 > > 架构师必知必会之分段式提交|推荐收藏
先来露怯一波:记得我工作年在做DBA的时候,周末去一个培训机构听数据库相关的讲座,当时提到了广义上分布式事务的问题,旁边一个地中海的老哥,脱口而出两段式提交。当时的我并不太了解这个知识点,网上也搜了下资料,瞬间崩溃,完全看不懂。感叹当初要是有那么一套系列文章该有多好。

在上一篇分布式事务中,我们了解到了什么是分布式事务,分布式事务的分类有哪些。在解决方案上,分布式事务分为刚性事务和柔性事务。
这里我们趁着这个机会重点讲一下刚性事务,顺便解一下当年之痛。
刚性事务是指从底层服务端的解决方案,业务并不需要在业务层面做逻辑调整。实现的是强一致性,但由于同步阻塞的问题,导致并发性差,因此适合短事务。在刚性事务中代表方案为2PC、3PC即两段式提交和三段式提交。
在提及分段式提交之前,我们先介绍下XA协议。XA协议是在1994年由Tuxedo提出的,并且提交给X/Open组织,在XA协议提出之后,各大主流的数据库产品也纷纷提供了对XA协议的支持,比如Oracle、MySQL、DB2等。
XA协议定义了接口标准,打通资源管理器(RM)与事务管理器(TM)的通信过程,从而更好的管理分布式事务,为了不影响后续的阅读,我再重新简单介绍下RM和TM的定义。更全面的介绍,请参考上一篇《啥?分布式啥?啥事务?》
前面提到的2PC、3PC就是XA协议的衍生品。
2PC全称是Two-phaseCommit,也就是我们俗称的二段式提交,2PC是一个非常经典的强一致、中心化的原子提交协议。网上很多资料在介绍2PC的时候会重新定义协调者(coordinator)和参与者(participants)的角色,这也是为啥大家会蒙的原因之一,实际上这里的协调者和参与者就是对应的事务管理器Transaction Manager和资源管理器Resource Manager。
2PC,顾名思义,整个过程一共分为两个阶段,即

此时在阶段执行完成后,会面临两个结果

如果阶段结果为A,则作为异常处理。

如果阶段结果为,即资源管理器(参与者)全部反馈的A,则作为正常处理。

无论第二阶段是异常回滚还是正常提交,都标志着当前事务的结束
2PC虽然将XA规范方案细化成思路,也形成了流程图,大部情况下确实能提供原子性操作,但是缺存在着几个问题:
3PC全称是Three-phaseCommit,也就是我们俗称的三段式提交, 3PC的提出主要是在2PC的基础上进行改良,为了解决两段式提交协议的同步阻塞问题,2PC存在的问题是当事务管理器(协调者)崩溃或者宕机的时候,资源管理器(参与者)不能做出后的选择。因此资源管理器(参与者)会在协作者事务管理器(协调者)保持阻塞。
3PC整体流程如下图所示:

3PC的CanCommit阶段其实和2PC的准备阶段很像。
事务管理器(协调者)根据资源管理器(参与者)在CanCommit阶段的反馈情况来确定时候需要继续下一步,执行PreCommit操作。
阶段完成后会面临两种情况:
Result-A: 所有的资源管理器(参与者)反馈的都是Yes
Result-B: 资源管理器(参与者)反馈中的存在No,或者超时时间内没有收到响应
该阶段进行真正的事务提交,即对所有资源进行释放,也涉及到两种情况
阶段完成后会面临两种情况:
Result-A: 所有的资源管理器(参与者)都有反馈ACK
Result-B: 资源管理器(参与者)在超时时间内没有反馈ACK
在2PC的基础上,3PC主要优化了上面提到1、2、4问题:
在事务管理器(协调者)和资源管理器(参与者)之间都引入了超时机制。这里注意在资源管理器(参与者)向事务管理器(协调者)返回信息时,如若超时均会被认为失败,执行中断或回滚事务的流程;而在DoCommit阶段中,资源管理器(参与者)即使在超时时间内没有收到事务管理器(协调者)的信息,也会进行本地的事务提交处理;这样就解决了同步阻塞时间长的问题。但如果事务管理器(协调者)执行的是Abort请求,但资源管理器(参与者)在网络阻塞或其他原因没有收到信息,也会执行Commit操作,这样又引入了新的数据不一致问题。
3PC对2PC的个阶段进行了拆分,得到CanCommit阶段、PreCommit阶段、DoCommit阶段,3PC的CanCommit阶段并不会持有资源,如果事务管理器(协调者)宕机也降低范围会降低;
对于事务管理器(协调者)和资源管理器(参与者)都宕机,引发事务执行进度丢失的问题,3PC中当事务管理器(协调者)恢复(选举机制暂时不过多解释)时,会询问其他的资源管理器(参与者)事务执行进度,这里其他节点要么是Commit阶段,要么是PreCommit阶段或者是Rollback阶段。
2PC和3PC一般应用于数据库当中,但2PC和3PC也不是银弹,并不适合高并发的场景。
并且无论是哪一个都不能彻底解决分布式系统一致性的问题,有数据一致性的隐患存在。
Google Chubby的作者Mike Burrows说过, there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos. 意即:世上只有一种一致性算法,那就是Paxos,看来真的需要后续我们研究一下Paxos了。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3126511/ ,如需转载,请注明出处,否则将追究法律责任。