官方文档: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
二阶消息
1、向tm服务发起进行全局事务请求(http,grpc) dtm.trans_global (dtm.trans_branch_op) 成功 向dtm.trans_global数据库插入一条全局事务gid,以及一条子事务 status:prepare 向dtm.trans_branch_op 数据库插入子事务(分支事务) 失败 返回错误,事务结束 2、向子事务屏障插入一条数据(dtm_barrier.barrier)之后处理本地业务事务 成功:子事务屏障插入一条reason:msg,下一步 失败:子事务屏障失败(本地事务未执行)回滚,本地事务失败,子事务屏障回滚 向tm服务发起abort请求 成功:dtm.trans_global状态修改成fail 表示全局事务失败, 失败:返回失败(tm发现事务超时之后自动发起子事务屏障查询) (dtm.trans_global) (dtm_barrier.barrier) gid:wTvb225Pqhb7geC7VZGNqY,本地事务或者子事务屏障失败 dtm.trans_global:fail dtm_barrier.barrier rollback 3、向tm服务提交sumbit,事务提交到tm进行管理(方便tm服务器调用子事务) 成功: dtm.trans_global状态修改成submit,下一步 失败:返回失败(tm发现事务超时之后自动发起子事务屏障查询) (dtm.trans_global) (dtm.trans_global) (dtm.trans_branch_op) gid: 9DyYSPKqXr8Bm4EjD8ovuT submit 提交成功 但是tm调用子事务失败 4、tm服务调用子事务 成功:子事务屏障插入一条reason:action,dtm.trans_branch_op status:success,dtm_trans_global status:success 失败:继续尝试(3次)之后人工介入
(dtm_barrier.barrier)
(dtm.trans_global)
(dtm.trans_branch_op)
gid:9DyYSPKqXr8Bm4EjD8ovuT(程序修正之后) 子事务成功
tm子事务屏障查询
tm服务发起向子屏障事务查询该事物查询(以改代查,利用数据库的唯一索引) 向子事务屏障插入一条数据(reason:rollback)如果成功 表示本地事务和子事务屏障未执行成功,全局事务失败,dtm.trans_global状态修改成fail
如果失败 表示本地事务和子事务屏障执行成功dtm.trans_global改成sumbit执行下一个步骤
注意:submit提交成功,子事务不管成不成功都不会回滚,又tm自动尝试3次子事务请求,如果都失败需要人工介入查询问题,通过需改next_cron_time再次执行
时序图: