分布式事务dtm(二 saga)

官方文档:Home | DTM开源项目文档

常用事务类型:二阶消息、saga、tcc、xa

以MySQL为例

      SQL语句  https://github.com/dtm-labs/dtm/tree/main/sqls

trans_branch_op  子事务   

       唯一索引  `gid`, `branch_id`, `op`

        branch_id 分支id :01

        status:prepare success

trans_global 全局事务

        唯一索引:gid

       status :prepare,submit,abort,fail success

barrier 子事务屏障

    `gid`, `branch_id`, `op`, `barrier_id`

      trans_type:msg,saga,tcc,xa

saga

        1、向tm发起全局事务注册

        trans_global 的status :submitted

       trans_branch_op注册子事务,一个子事务包含事务确认执行、事务补偿 (op字段区分)

  

trans_branch_op 

trans_global

     2、tm服务发起子事务调度

                子事务执行

                        成功:插入一条barrier    barrier.op:action  reason:action

                                  trans_branch_op(op:action).status :success        

                        

                        失败: 返回500 继续尝试 返回409 事务失败进行补偿    trans_global.status:fail,

                                       trans_branch_op(action).status :fail

                                        执行补偿       

子事务执行成功插入barrier数据

子事务执行失败并返回409

  子事务返回409,执行补偿操作,如果补偿能过插入op:action 的数据表示不需执行补偿操作,从而进行了空补偿 

     

注意:子事务执行失败时候是否需要补偿,返回409进行补偿,500继续重试

空补偿、悬挂 问题解决

        由于网络等问题,子事务超时,tm服务发起补偿操作。

          补偿的时候originAffected=1(还没有执行完成子事务)时,空补偿不执行后面的补偿函数

          子事务这个时候插入事务操作失败直接返回,子事务悬挂

时序图

                                        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值