官方github:https://github.com/yedf/dtm
1、首先根据文档把dtm部署在服务器
2、下面演示【SAGA模式】 用户2给用户1转账30元 的例子
a、数据表有两个账户
b、先把用户1记录锁起来,使之不能被转账
c、运行saga示例
go run app/main.go saga_barrier
d、查看账户表情况,可以看到用户2被扣款30元,扣款事务已提交持久化,但因为用户1账户被锁了,saga事务需要等待
e、当等待锁时长超过了innodb_lock_wait_timeout配置的时间,则程序会panic,但程序依然继续重试。直到超过上限(1hour)
panic unknown response: {"code":500,"message":"Error 1205: Lock wait timeout exceeded; try restarting transaction"}, will be retried handlered
f、这时候把用户1解锁,就可以看到用户1的转账到账了(重试有时间间隔,不一定马上到账)
commit;
3、下面演示【TCC模式】 用户2给用户1转账30元 的例子
a、b同上
c、运行tcc实例
go run app/main.go tcc_barrier
d、查看当前余额表以及交易记录表,可以看到用户2的余额事务还没提交,但交易记录表有记录
e、释放用户1锁后,正常扣款到账
4、注意事项
需要使用最新版master代码,旧代码重试两次就不会重试,已跟作者反馈,作者已修复(2021-7-29)https://github.com/yedf/dtm/issues/8
来自anson博客
2021-07-27 19:02:43