两阶段提交协议的异常处理

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

两阶段提交的协议大家都比较熟悉了,解释一下每个阶段的异常处理。首先,我们需要持久化协议过程中的状态,这样如果server宕机,那么恢复的时候还能通过日志知道宕机前处于那个阶段。同时,所有对数据的修改都会先写write ahead log,保证宕机重启的之后数据也不会丢失。写日志的顺序假定为:写write ahead log-修改缓冲区-写commit/abort log。

在这个前提下,我们根据如下的时序图来讨论异常情况和处理方法。

两阶段提交协议时序

两阶段提交协议时序


  1. 过程a没有成功,即协调者没有收到部分参与者的回应。超时后,协调者发送abort消息给参与者取消事务。参与者存在两种情况:

    • 过程1失败,网络问题导致参与者没有收到vote request消息或者此时参与者宕机。参与者重启恢复后无需做任何事。

    • 过程2失败,参与者收到了vote request,网络问题协调者没有收到回复或此时参与者宕机。参与者宕机恢复或等待超时后广播DECISION_REQUEST消息向其他参与者询问是否收到commit/abort消息。

  2. 过程b没有成功,即协调者发送commit消息之后没有收到部分参与者的回应。协调者需要重试,确认参与者的提交完毕消息,如果多次尝试不能联系上,则等待参与者上线之后解决。参与者存在两种情况:

    • 过程3失败,网络问题导致参与者没有收到commit消息或此时参与者宕机。参与者上线发现在本地日志中发现尚未提交成功,因为到达这里,可以肯定本地已做好提交准备,但是不知道协调者是决定提交,所以向协调者询问,按协调者的回复来进行提交或回滚。如果无法联系上协调者,则向其他参与者询问事务状态,如果有某一个节点已经做了提交或异常终止(说明协调者已发送了相关消息),则做同样的操作。

    • 过程4失败,参与者完成了commit/rollback,但是网络问题协调者没有收到回应或者此时参与者宕机。参与者在本地日志中发现已完成本地提交,所以可能由于网络故障导致提交完成消息没有到达协调者。所以直接忽略。这时可能协调者在等待该参与者的提交完成回应消息,所以参与者主动联系协调者告知事务状态。

  3. 过程c没有成功,即参与者发送vote回应消息之后没有等到协调者的commit/rollback消息。这个过程参与者的异常处理已经讨论过了,这里讨论协调者的异常处理。存在两种情况:

    • 过程2失败,网络问题导致协调者没有收到回复或此时协调者宕机。协调者恢复重启后,发现并未做提交操作,保险操作(因为不知道它是否发送过准备消息,或其他参与者是否做好提交准备),直接发送abort消息给所有参与者,终止事务

    • 过程3失败,网络问题导致参与者没有收到commit/rollback消息或者此时协调者宕机。协调者恢复重启后,不能保证所有参与者都已收到了提交消息,所以给所有的参与者发送commit消息,保证事务的正常提交。

参考文献:

[1] 两阶段提交(2PC)协议, http://blog.chinaunix.net/uid-20761674-id-75164.html

原文链接:http://cxh.me/2014/07/07/two-process-commit-exceptions/

特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt371
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
8月前
|
消息中间件 Dubbo 应用服务中间件
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
分布式事物【Hmily实现TCC分布式事务、Hmily实现TCC事务、最终一致性分布式事务解决方案】(七)-全面详解(学习总结---从入门到深化)
216 0
|
5月前
|
数据库 微服务
GTS事务执行过程
【8月更文挑战第25天】
63 4
|
5月前
|
微服务 运维 监控
TCC和本地事务 容错
【8月更文挑战第10天】
64 12
|
5月前
|
微服务 中间件
TCC事务 基本思路
【8月更文挑战第9天】
55 4
|
8月前
|
消息中间件 Java 关系型数据库
Spring事务与分布式事务
这篇文档介绍了事务的概念和数据库事务的ACID特性:原子性、一致性、隔离性和持久性。在并发环境下,事务可能出现更新丢失、脏读和不可重复读等问题,这些问题通过设置事务隔离级别(如读未提交、读已提交、可重复读和序列化)来解决。Spring事务传播行为有七种模式,影响嵌套事务的执行方式。`@Transactional`注解用于管理事务,其属性包括传播行为、隔离级别、超时和只读等。最后提到了分布式事务,分为跨库和跨服务两种情况,跨服务的分布式事务通常通过最终一致性策略,如消息队列实现。
99 0
|
SQL 消息中间件 数据库
带你读懂事务(下)、分布式事务
带你读懂事务(下)、分布式事务
101 0
|
数据库
分布式事务之三阶段提交协议
分布式事务之三阶段提交协议
89 0
分布式事务Seata【四】事务补偿(TCC)
常见的分布式事务解决方案有 TCC、全局消息、基于可靠消息服务的分布式事务、最大努力通知等
1045 1
分布式事务Seata【四】事务补偿(TCC)
|
Java 中间件 数据库
谈谈分布式事务TCC机制
分布式事务是几乎所有分布式微服务系统中,最棘手也是最重要的一个点了。在讲解分布式事务前,先了解下数据库事务的特性;数据库事务的几个特性:原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation)和持久性(Durabilily),简称就是ACID。
210 0
谈谈分布式事务TCC机制

热门文章

最新文章

下一篇
开通oss服务