官方文档: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(还没有执行完成子事务)时,空补偿不执行后面的补偿函数
子事务这个时候插入事务操作失败直接返回,子事务悬挂
时序图