分布式事务常见的问题是发生事务积压,事务积压的原因通常是参与方问题导致的,可能是由于参与方二阶段执行失败或执行超时,也可能是因为参与方与分布式事务服务端连接异常等问题。本文将基于参与方的常见问题,引导您快速排查并解决事务积压问题。
参与方二阶段执行失败
在参与方的二阶段执行日志 ${user.home}/logs/dtx-drm.log
中,搜索事务 ID ,检查是否是由于参与方二阶段业务本身执行失败,返回 false,再继续分析业务逻辑找到具体的执行失败原因。
执行失败日志示例如下:
2019-06-2517:19:54,061 INFO dtx-bolt-pool-12- branch commit result:[false], message:[class:[com.alipay.dtx.rpc.message.server.request.BranchCommitRequest]:{"actionContext":{"sys::rollback_method":"rollback","action-start-time":1561453729969,"sys::prepare":"doPrepare","tracerInfo":"tcid=0d0d00061561453729832100274810&spid={spid}&pspid={pspid}&sample=false&dtx_id=3521a9ab55474738a296eda97fe39f6701-0000000000&","appName":"sofa-server","rpcId":"0.3949f9b2","sys::commit_method":"commit","host-name":"10.81.60.101","tracerId":"0d0d00061333333729832100274810","sys::class_name":"com.alipay.dtx.sample.action.facade.FirstAction","actionName":"FirstAction"},"actionId":"94021b09f8314aceb3ffede77b682900","activityContext":{"bizType":"trade","start-time":1561453729846,"tracerInfo":"tcid=0d0d00061561453729832100274810&spid=0&pspid=&sample=false&","appName":"sofa-client","isolationLevel":"READ_UNCOMMITTED","rpcId":"0","host-name":"13.13.X.X","tracerId":"0d0d00061333333729832100274810"},"instanceId":"VOQKxxxXCWID","resourceId":"SOFABOOT_RPC&FirstAction&&","resourceType":2,"txId":"3521a9ab55474738a296eda97fe39f6701-0000000000"}].
参与方二阶段执行超时
检查 ${user.home}/admin/logs/dtxserver/common-error.log
系统错误日志,查看是否是由于参与方二阶段执行超时问题造成的事务积压。
执行超时日志示例如下:
2019-06-2517:08:53.264[message-executor] ERROR DTX-REMOTE -BusinessAction handle exception,txId:3521a9ab55474738a296eda97fe39f6701-0000000000, instanceId:VxxKVVWXCWID com.alipay.remoting.rpc.exception.InvokeTimeoutException:Rpc invocation timeout[responseCommand TIMEOUT]! the address is10.25.172.207:51083
at com.alipay.remoting.rpc.RpcResponseResolver.preProcess(RpcResponseResolver.java:91)
at com.alipay.remoting.rpc.RpcResponseResolver.resolveResponseObject(RpcResponseResolver.java:56)
····
参与方初始化失败
参与者启动时,可能会因为某些原因初始化失败,从而造成了事务积压。因此,您可以根据启动时间,排查 DTX 客户端的初始化日志:${user.home}/admin/logs/dtx/dtx-client.log
。
参与方与 DTX Server 连接失败
根据参与方启动时间,查看 DTX Server 的建连日志
${user.home}/admin/logs/dtx/dtx-rpc.log
,检查参与方是否与 DTX Server 建连失败,从而造成了事务积压。在参与方的机器上执行以下命令,确认其与 DTX Server 端口的连接情况:
netstat -anp|grep 14200
若发现参与方与某台 DTX Server 没有建立连接,当这台 DTX Server 进行提交操作(Commit)时,则会报错:
java.lang.RuntimeException: connection is null,targetIp:{xxx},txId:{xxx}
。此时,快速的恢复方法是重启参与方的应用,后续再排查连接无法建立的具体原因。
其他原因
除以上常见的参与方问题外,还可能是由于其他原因。您可以通过查看参与方二阶段执行日志 ${user.home}/logs/dtx-drm.log
或者DTX Server 错误日志 ${user.home}/admin/logs/dtxserver/common-error.log
根据具体的错误信息,具体分析原因。