seata通过feign调试遇到一个坑
此时global_table是有数据的
当跳进远程方法接口时
io.seata.core.exception.RmTransactionException: Response[ TransactionException[Could not found global transaction xid = 192.168.43.233:8091:126086493738274816, may be has finished.] ] at io.seata.rm.AbstractResourceManager.branchRegister(AbstractResourceManager.java:69) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.DefaultResourceManager.branchRegister(DefaultResourceManager.java:96) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.datasource.ConnectionProxy.register(ConnectionProxy.java:241) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.datasource.ConnectionProxy.processGlobalTransactionCommit(ConnectionProxy.java:219) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.datasource.ConnectionProxy.doCommit(ConnectionProxy.java:199) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.datasource.ConnectionProxy.lambda$commit$0(ConnectionProxy.java:184) ~[seata-all-1.4.0.jar:1.4.0] at io.seata.rm.datasource.ConnectionProxy$LockRetryPolicy.execute(ConnectionProxy.java:292) ~[seata-all-1.4.0.jar:1.4.0]
看调用者日志
原来是Hystrix超时了,调用者抛出异常并且向seata server发起删除global_table操作。下游断点位置找不到global_transaction.
再梳理一下:
上游为A服务,下游为B服务;
A先向seata server注册xid,然后A调用B,此时B执行db操作前停在断点上,结果此时超时了,A抛异常了,向seata server申请回滚,因为此时B停在断点上,还没有向seata申请过branchId,由于seata server没办法知道B的代码是什么,(seata此时可以理解为只有目前只有A跟我有联系过,除此之外没有别的服务跟我有联系过申请过branchid,因为此时A回滚成功,所以seata就删除global_table)