apache / incubator-seata

:fire: Seata is an easy-to-use, high-performance, open source distributed transaction solution.
https://seata.apache.org/
Apache License 2.0
25.22k stars 8.76k forks source link

为何二次提交PhaseTwo_Committed会执行多次 #3718

Open ZaneGeng opened 3 years ago

ZaneGeng commented 3 years ago

问题描述:同一个分布式事务执行了多次PhaseTwo_Committed操作,请教如何解决:

2021-05-10 15:07:52.336 [http-nio-7101-exec-5] INFO io.seata.tm.api.DefaultGlobalTransaction - [172.26.201.26:8091:135036741874720768] commit status: Committed 2021-05-10 15:07:52.438 [rpcDispatch_RMROLE_1_3_4] INFO i.s.c.rpc.processor.client.RmBranchCommitProcessor - rm client handle branch commit process:xid=172.26.201.26:8091:135036741874720768,branchId=135036742071853056,branchType=AT,resourceId=jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product,applicationData=null 2021-05-10 15:07:52.438 [rpcDispatch_RMROLE_1_3_4] INFO io.seata.rm.AbstractRMHandler - Branch committing: 172.26.201.26:8091:135036741874720768 135036742071853056 jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product null 2021-05-10 15:07:52.438 [rpcDispatch_RMROLE_1_3_4] INFO io.seata.rm.AbstractRMHandler - Branch commit result: PhaseTwo_Committed 2021-05-10 15:07:52.439 [rpcDispatch_RMROLE_1_4_4] INFO i.s.c.rpc.processor.client.RmBranchCommitProcessor - rm client handle branch commit process:xid=172.26.201.26:8091:135036741874720768,branchId=135036742147350528,branchType=AT,resourceId=jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product,applicationData=null 2021-05-10 15:07:52.439 [rpcDispatch_RMROLE_1_4_4] INFO io.seata.rm.AbstractRMHandler - Branch committing: 172.26.201.26:8091:135036741874720768 135036742147350528 jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product null 2021-05-10 15:07:52.439 [rpcDispatch_RMROLE_1_4_4] INFO io.seata.rm.AbstractRMHandler - Branch commit result: PhaseTwo_Committed 2021-05-10 15:07:52.440 [rpcDispatch_RMROLE_1_1_4] INFO i.s.c.rpc.processor.client.RmBranchCommitProcessor - rm client handle branch commit process:xid=172.26.201.26:8091:135036741874720768,branchId=135036742281568256,branchType=AT,resourceId=jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product,applicationData=null 2021-05-10 15:07:52.440 [rpcDispatch_RMROLE_1_1_4] INFO io.seata.rm.AbstractRMHandler - Branch committing: 172.26.201.26:8091:135036741874720768 135036742281568256 jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product null 2021-05-10 15:07:52.440 [rpcDispatch_RMROLE_1_1_4] INFO io.seata.rm.AbstractRMHandler - Branch commit result: PhaseTwo_Committed 2021-05-10 15:07:52.441 [rpcDispatch_RMROLE_1_2_4] INFO i.s.c.rpc.processor.client.RmBranchCommitProcessor - rm client handle branch commit process:xid=172.26.201.26:8091:135036741874720768,branchId=135036742382231552,branchType=AT,resourceId=jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product,applicationData=null 2021-05-10 15:07:52.441 [rpcDispatch_RMROLE_1_2_4] INFO io.seata.rm.AbstractRMHandler - Branch committing: 172.26.201.26:8091:135036741874720768 135036742382231552 jdbc:mysql://172.26.201.26:3306/zg101-springcloudalibaba-product null 2021-05-10 15:07:52.441 [rpcDispatch_RMROLE_1_2_4] INFO io.seata.rm.AbstractRMHandler - Branch commit result: PhaseTwo_Committed

xyz327 commented 3 years ago

每个 branchId 都不一样,属于不同的分支事务的二阶段提交

ZaneGeng commented 3 years ago

我的业务只有两个服务间调用,在同一个分布式事务中,相同的xid,为何会有这么多个branchId 呢,这些重复的二阶段提交不是每次都有,相同接口有时只有一行,有时就如上图有很多行

xyz327 commented 3 years ago

这个就要看业务是怎么使用 seata 的了

luckyqiao commented 3 years ago

加些日志看下,是不是同一个分支被调用了多次

luckyqiao commented 3 years ago

你在你分支的入口打个日志,看看有没有被多次调用,就可以很快看出问题了。

ZaneGeng commented 3 years ago

一共就一个分支,也没有被多次调用,考虑过幂等性问题,而且这个分支提交的日志记录数量,在同一个接口每次都不太一样,如下图: 微信截图_20210514143452

funky-eyes commented 3 years ago

at模式下一个如果你的rm最外层没加本地事务注解决那么一个dml操作,就是一个分支事务

ZaneGeng commented 3 years ago

at模式下一个如果你的rm最外层没加本地事务注解决那么一个dml操作,就是一个分支事务

本接口虽然涉及两个服务,但一共只有3个dml操作,而且不存在重复执行幂等性问题,并且这个二次提交日志的数量,相同业务下每次数量都不太一样

funky-eyes commented 3 years ago

at模式下一个如果你的rm最外层没加本地事务注解决那么一个dml操作,就是一个分支事务

本接口虽然涉及两个服务,但一共只有3个dml操作,而且不存在重复执行幂等性问题,并且这个二次提交日志的数量,相同业务下每次数量都不太一样

能提供一个可复现的demo?