store.mode=db 事务结束后globalsession的状态未正确修改为commited

发生的情况

saga模式下 store.mode = db 事务结束后globalsession的状态未正确修改为commited,依然还是begin,导致global表中状态为1,等待1800s后会对事务进行回滚; SessionHelper中endCommitted的中的

public static void endCommitted(GlobalSession globalSession, boolean retryGlobal) throws TransactionException {
    if (retryGlobal || !DELAY_HANDLE_SESSION) {
        long beginTime = System.currentTimeMillis();
        boolean retryBranch = globalSession.getStatus() == GlobalStatus.CommitRetrying;
        globalSession.changeGlobalStatus(GlobalStatus.Committed);
        globalSession.end();
        if (!DELAY_HANDLE_SESSION) {
            MetricsPublisher.postSessionDoneEvent(globalSession, false, false);
        }
        MetricsPublisher.postSessionDoneEvent(globalSession, IdConstants.STATUS_VALUE_AFTER_COMMITTED_KEY, true,
            beginTime, retryBranch);
    } else {
        MetricsPublisher.postSessionDoneEvent(globalSession, false, false);
    }
}

store.mode = db 时DELAY_HANDLE_SESSION为true,进不了分支,导致不能changeGlobalStatus为Committed

如何复制步骤回顾

把DELAY_HANDLE_SESSION的取反去掉

原提问者GitHub用户gaozx95

展开
收起
学习娃 2023-06-14 16:57:12 95 分享 版权
1 条回答
写回答
取消 提交回答
  • 回答3.png

    这里已经把状态改成了Committing,不会是Begin,这里解决的问题应该只是saga模式下metrics没有打Committed点的问题

    这里的延迟删除是一种兜底策略,延迟删除GlobalSession,防止有残留的锁和Branch在GlobalSession被删除后没有全局事务关联他们,导致这些残留的锁和Branch一直存在

    原回答者GitHub用户tuwenlin

    2023-06-14 17:27:40
    赞同 展开评论
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理