禁用事务 (Disabled Transactions) 与终止事务 (Terminated Transactions)

禁用事务 (Disabled Transactions)

如果某些事务在事务生命周期 (Transaction Lifetime) 内经过多次重试后仍然超时过期,这些事务将被标记为*禁用事务 (Disabled Transactions)*。

导致事务未能完成并最终过期的原因有哪些?

  1. 在事务执行期间某些执行器 (Executors) 发生了变更。
    例如,假设某个事务在服务版本 1.0.0 中发起,由于目标服务不可用而在重试队列中保持了一段时间;在此期间如果部署了新版本,而新版本中删除了该执行器,那么该事务将无法被执行。 即使该事务被传递去重试,由于执行器不存在,事务也无法执行。 即使此时未找到执行器,系统仍会一次又一次地重新调度该事务进行重试,直到达到事务生命周期的终点。 生命周期结束后,该事务将被标记为禁用事务。

    即使未找到执行器仍重新调度事务的原因是,开发和运维团队能够识别问题并在生命周期结束前进行修复。 发生此类错误时,StackSaga 框架会在 StackSaga Trace Window (链路追踪窗口) 中发出问题通知。
  2. 未找到目标服务主机 (Target Service Host)。
    如果目标主机持续未找到,直到超出生命周期,该事务在生命周期结束后将被标记为禁用事务。

    此时系统不会通过 StackSaga Trace Window 发出警告,因为底层资源暂时不可用属于框架允许并处理的正常瞬态故障。

终止事务 (Terminated Transactions)

如果事务在回滚补偿 (Revert) 过程中失败,该事务将被标记为*终止事务 (Terminated Transactions)*。因为在 StackSaga 中,回滚补偿流程除抛出 RetryableException (可重试异常) 之外不允许失败。 终止事务与禁用事务的区别在于:终止事务会在未耗尽生命周期时就立即停止重试。

如何恢复禁用事务与终止事务?

禁用事务和终止事务的根本问题应由团队人工排查和定位。 修复缺陷并准备好重新执行这些事务后,您可以恢复事务以进行重试。

系统提供了 2 个端点用于处理禁用事务和终止事务:

  1. 获取禁用事务与终止事务 (Fetching the Disabled Transactions and Terminated Transactions)。
    您可以通过此端点拉取禁用事务和终止事务,用于分析错误和定位问题。

  2. 恢复禁用事务与终止事务 (Restoring the Disabled Transactions and Terminated Transactions)。
    您可以通过此端点延长事务的生命周期,从而恢复并重新触发这些事务的重试。

不同实现方式 (Implementation) 下的端点可能有所不同,请根据您所使用的具体实现查找对应的端点。