分布式事务管理器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 2023-02-02 21:00  koushr  阅读(226)  评论(0编辑  收藏  举报

导航