分布式事务管理器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接口的逻辑是:

posted on   koushr  阅读(295)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示