异常事务处理方案

清除异常任务数据

问题现象

事务提交异常,并且业务需求不再需要提交,需要清除异常事务。

问题原因

业务代码问题导致事务提交异常。

解决方案

  1. 进入 dtxserver 的 dtx_remote 库。

  2. 使用如下命令查询 business_actionbusiness_activity 表中的 txid 记录:

    select * from business_action_01 where tx_id ="XXXXXX"

    select * from business_activity_01 where tx_id = "XXXXXX"

  3. 清除异常任务信息。

    1. dtx_remote 库的 business_actionbusiness_activity 表不为空,则使用如下命令清除异常任务信息:

      delete from business_action_01 where tx_id ="XXXXXX"

      delete from business_activity_01 where tx_id ="XXXXXX"

    2. dtx_remote 库的 business_actionbusiness_activity 表为空,则进行如下操作:

      1. 根据客户的分库分表规则找出对应分库。

      2. 根据事务 ID 查找到 DTX 数据库,进入 dtx_shard_X 分库。

      3. 使用如下命令查询分库中 business_actionbusiness_activity 表中的 txid 记录:

        select * from business_action_01 where tx_id ="XXXXXX"

        select * from business_activity_01 where tx_id = "XXXXXX"

        说明

        若想要提高查询速度,您可以在 DTX 配置数据库 dtx_config 使用 delete from dtx_transaction where tx_id="xxxxxx" 命令清除事务统计表的数据:

      4. 使用如下命令清除异常任务信息:

        delete from business_action_01 where tx_id ="XXXXXX"

        delete from business_activity_01 where tx_id ="XXXXXX"

  4. 清除异常任务后,单击 事务详情,若发生报错“java.langIllegalArgumentException:发起方数据不存在,可能已经被清理”,表示已清除成功。

事务回滚异常

问题现象

  • 事务状态显示:异常(回滚异常)。

  • 发起方 common-error.log 日志出现大量报错“DTX-REMOTE - invokeAction rollback finish"。

问题原因

DTX 参与方不在线,DTX server 无法联系参与方回滚成功。

解决方案

以下提供两种解决方案:

  • 通过日志排查参与方不在线原因。

    dtx-remote.log 或者 commen-error.log 日志中查看报错信息,根据报错信息找出参与方不在线原因。

  • 若事务已不需要回滚,则删除该事务回滚即可。

    1. 进入 dtxserver 的 dtx_remote 库。

    2. 使用如下命令查询 business_actionbusiness_activity 表中的 txid 记录:

      select * from business_action_01 where tx_id ="XXXXXX"

      select * from business_activity_01 where tx_id ="XXXXXX"

    3. 清除 txid 数据。

      TCC 模式

      使用如下命令将 dtxsever 的 dtx_remote 库中 txid 数据清除:

      delete from business_activiy where tx_id ="XXXXXX"

      delete from business_action where tx_id ="XXXXXX"

      FMT 模式

      1. 使用如下命令,将 dtxsever 的 dtx_remote 库中 txid 数据清除:

        delete from business_activiy where tx_id ="XXXXXX"

        delete from business_action where tx_id ="XXXXXX"

      2. 使用如下命令,将用户的业务数据库中 dtx_branch_infodtx_row_lock 表中 txid 数据清除:

        delete from dtx_branch_info where tx_id ="XXXXXX"

        delete from dtx_row_lock where tx_id ="XXXXXX"

    4. 清除异常任务后,单击 事务详情,若发生报错“java.langIllegalArgumentException:发起方数据不存在,可能已经被清理”,表示已清除成功。