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