分布式事务管理器dtm第三篇:二阶段消息模式
二阶段消息的英文是2-phase message。
AP先向dtm发送prepare消息,如果成功,则继续执行本地事务,如果成功,则继续向dtm发送submit消息。如果成功,则dtm调用各RM的接口,如果成功,则全局事务成功。
时序图如下:
dtm服务端处理prepare时,会在dtm_barrier.barrier表里新增一条记录,形如:
dtm服务端处理submit时,会修改dtm_barrier.barrier表对应的记录,把status值修改为succeed。
异常情况1:AP在成功向dtm发送prepare消息后、提交本地事务前宕机。
Msg的DoAndSubmitDB方法的第三个参数是一个函数,这个函数在prepare后、submit前执行。可以在函数实现中执行os.Exit(-1)来模拟宕机。
prepare后,如果长时间不submit,那么dtm就会调用queryPrepared接口。
如果queryPrepared接口返回errors.New("FAILURE"),那么dtm会把全局事务置为failed。
如果queryPrepared接口返回errors.New("ONGOING"),那么dtm会一直尝试调用,调用间隔时间恒定。
如果queryPrepared接口调不通,那么dtm会一直尝试调用,调用间隔时间会逐次翻倍。
时序图如下:
异常情况2:AP在提交本地事务成功后、向dtm发送submit消息前宕机。
时序图如下:
queryPrepared接口的逻辑是:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)