-
Notifications
You must be signed in to change notification settings - Fork 966
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
http_workflow_tcc_barrier 某种异常情况下,子事务 rollback 之后又会走到 commit 步骤 #453
Comments
dtm-examples 的go mod如下 module github.com/dtm-labs/dtm-examples go 1.15 require ( // replace github.com/dtm-labs/client/dtmcli => /Users/wangxi/dtm/dtmcli // replace github.com/dtm-labs/client/dtmgrpc => /Users/wangxi/dtm/dtmgrpc |
作为分布式应用,需要做到幂等,这个是基本要求。4和7的行为不是幂等行为,因此属于你的业务程序设计问题,而不是dtm的行为。如果业务不幂等,无论dtm怎么做,都无法保证数据一致 |
|
是的,barrier可以保证幂等,但是你在barrier记录失败之后,又设置TccBTransInTry 执行成功,这就矛盾了,barrier记录失败之后,永远不再会返回成功了
网络超时失败,跟子事务失败回滚完全不同,dtm会重试网络失败,而不是把事务分支记录为失败,
这个行为不是dtm自发行为,是中间错误的修改了子事务的逻辑造成的 |
这个事情发生了之后,返回ResultFailure,就不会再返回成功了,即使金币足够了,也只会返回barrier保存的失败 |
@yedf2 不啊,返回ResultFailure之后,barrier不会保存失败,是rollback的 |
这样吧,你给个复现了问题的可运行的代码例子,而不是你手动的debug改数据,这样描述的问题最清晰最准确,就能够弄清楚怎么回事了 |
@yedf2 我在dtm-examples上写了一下可以复现问题的代码例子,但是没有权限push分支(从main分支拉出来的分支),无法跟你这边交流 |
@relxet 这个写法 barrier和业务逻辑 就是 用同一个sql.Tx 呀 |
TccBTransOutRollback 在崩溃前,执行成功了没有?如果成功了,dtm恢复以后是直接走rollback流程,而不是像你说的,重新从try再走一遍流程 |
而且try是客户端触发的,try再执行一次,就是一个新的事务 |
TccBTransOutRollback执行成功之后,业务服务器崩溃,全局事务未到终态,dtm服务器会不断得调用resume来重试,业务服务器恢复之后,resume在业务服务器中执行的顺序是从头开始(用之前的全局事务id),调用TccBTransOutTry,此时虽然该全局事务下该事务分支已经有了rollback的记录,但是barrier是返回的成功,所以接下来会继续执行TccBTransInTry,如果这个时候TccBTransInTry执行成功,就会进入到commit的流程 |
resume的话,不是新的事务,是之前的全局事务 |
你搞错了,try是ap端直接call的,tm不会去call try,何来从头开始。ap重新call try,就要注册一个新的gid,就是一个新事物了。 |
@relxet |
你一个事务分支的rollback都执行过了,还要让ap从try再跑一遍?你这流程就不是dtm的流程。你就要让dtm把当前这个事务rollback完,ap端重新发起一次新的事务,而不是原来的事务重新从try跑一遍。 |
@relxet |
tcc协议中定义为commit和rollback必须成功,你不能重新从try跑一遍事务 |
@relxet 你先好好去看下workflow是怎么跑的,如果中间出错了,是怎么重试的 |
这跟workflow没关系,workflow也是几个协议的组合,saga的补偿操作,Tcc的Confirm/Cancel操作,协议上规定,不能允许失败。 |
@zhenlanghuo 你不需要push到dtm-examples下面,你只需要在你自己的github账号下面弄好了例子和说明,我就能够直接下载复现问题了 |
@yedf2 |
@relxet |
我发现了 dtm-examples http_workflow_tcc_barrier 例子中的一个异常情况的问题
复现步骤如下
也就是 TccBTransOut 分支在 rollback 的情况下,没有重新try的情况,又走到了 commit 的状态,这显然是不正确的
我认为 barrier 需要判断 try 操作之前是执行成功还是被 rollback 了,如果是执行成功就返回成功,如果是被 rollback 了就返回失败,这样重试的逻辑才正确
The text was updated successfully, but these errors were encountered: