【问题标题】:Atomikos error prepared transaction "transaction id" with identifier does not existAtomikos 错误准备了带有标识符的事务“事务 id”不存在
【发布时间】:2025-12-27 12:05:06
【问题描述】:

我有使用 Atomikos 作为事务管理器的 Spring Boot 应用程序,我看到了这个日志:

错误:标识符为“1096044365_MTcyLjE3LjAuMy50bTAwNDAyMDAwMDE=_MTcyLjE3LjAuMy50bTQwMg==”的准备好的事务不存在

连续打印。

阅读 Atomikos 文档后,我了解到 Atomikos 有一些崩溃恢复机制,我遵循了这个http://fogbugz.atomikos.com/default4343.html?community.6.1918.14,但它并没有解决我的问题。

我的问题是:为什么 Atomikos 会尝试永远清理 tx?当没有机会让它提交状态时。

下面是堆栈跟踪:

org.postgresql.xa.PGXAException:回滚准备好的事务时出错 在 org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:419) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:636) ~[transactions-jta-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:70) [transactions-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:83) [transactions-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:79) [transactions-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.Propagator.submitPropagationMessage(Propagator.java:58) [transactions-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.HeurHazardStateHandler.onTimeout(HeurHazardStateHandler.java:135) [transactions-3.9.3.jar!/:na] 在 com.atomikos.icatch.imp.CoordinatorImp.alarm(CoordinatorImp.java:933) [transactions-3.9.3.jar!/:na] 在 com.atomikos.timing.PooledAlarmTimer.notifyListeners(PooledAlarmTimer.java:112) [atomikos-util-3.9.3.jar!/:na] 在 com.atomikos.timing.PooledAlarmTimer.run(PooledAlarmTimer.java:99) [atomikos-util-3.9.3.jar!/:na] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_151] 引起:org.postgresql.util.PSQLException:错误:准备好的事务,标识符为“1096044365_MTcyLjE3LjAuMy50bTAwNDAyMDAwMDE=_MTcyLjE3LjAuMy50bTQwMg==”不存在 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:409) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] ...省略了12个常用框架

如何停止这种重试机制

更新到 4.0.6 后再次发生这种情况

2018年1月22日20:42:52.247 ERROR [的requestId:] 1 --- [Atomikos公司:51] c.a.datasource.xa.XAResourceTransaction:XAResourceTransaction的启发式终止:3137322E31372E302E342E746D313531363637303131363034343030383435:3137322E31372E302E342E746D383435与状态HEUR_HAZARD 2018-01-22 20:42:52.247 错误 [RequestId:] 1 --- [Atomikos:51] com.atomikos.icatch.imp.CoordinatorImp:协调器 172.17.0.4.tm151667011604400845 的本地启发式终止,状态为 HEUR_HAZARD 2018-01-22 20:42:52.247 错误 [RequestId:] 1 --- [Atomikos:51] com.atomikos.publish.EventPublisher:事务 172.17.0.4.tm151667011604400845 已损坏 - 检查 https://www.atomikos.com/Documentation/HowToHandleHeuristics 了解更多信息 2018年1月22日20:42:52.420警告[的requestId:] 1 --- [Atomikos公司:51] c.a.datasource.xa.XAResourceTransaction:XA资源'Postgres的:回滚为XID '3137322E31372E302E342E746D313531363637303131363034343030383435:3137322E31372E302E342E746D383435' 升高-3:所述XA 资源检测到内部错误

org.postgresql.xa.PGXAException:回滚准备好的事务时出错 在 org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:419) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 com.atomikos.datasource.xa.XAResourceTransaction.rollback(XAResourceTransaction.java:460) ~[transactions-jta-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:47) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:20) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:67) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:63) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.Propagator.submitPropagationMessage(Propagator.java:42) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.HeurHazardStateHandler.onTimeout(HeurHazardStateHandler.java:75) [transactions-4.0.6.jar!/:na] 在 com.atomikos.icatch.imp.CoordinatorImp.alarm(CoordinatorImp.java:650) [transactions-4.0.6.jar!/:na] 在 com.atomikos.timing.PooledAlarmTimer.notifyListeners(PooledAlarmTimer.java:95) [atomikos-util-4.0.6.jar!/:na] 在 com.atomikos.timing.PooledAlarmTimer.run(PooledAlarmTimer.java:82) [atomikos-util-4.0.6.jar!/:na] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_151] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_151] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_151] 引起:org.postgresql.util.PSQLException:错误:准备好的事务与标识符“1096044365_MTcyLjE3LjAuNC50bTE1MTY2NzAxMTYwNDQwMDg0NQ==_MTcyLjE3LjAuNC50bTg0NQ==”不存在 在 org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:374) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:302) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] 在 org.postgresql.xa.PGXAConnection.rollback(PGXAConnection.java:409) ~[postgresql-9.1-901-1.jdbc4.jar!/:na] ...省略了13个常用框架

【问题讨论】:

    标签: spring spring-boot spring-transactions jta atomikos


    【解决方案1】:

    这看起来像是 TransactionsEssentials 4.0.6 中修复的错误

    【讨论】:

    • 在 4.0.6 版本 2 天后,它看起来已修复,但我再次看到此问题发生。
    • 那么您可能想要求免费试用商业版?
    • @D7thename 你能解决这个问题吗?我们遇到了同样的问题。
    • 不,这会阻止我们发布产品。现在我们正在考虑2个选项。 1)试图查看 Atomikos 代码并找到一些东西。 2) 如果上述方法不起作用,则离开 Atomikos。无论我们遵循什么路径,都会在这里发布。
    • 感谢您的反馈。我们会尽快查看此问题(如果您想提高优先级,请考虑免费试用)。
    【解决方案2】:

    在深入研究 Atomikos 源代码并查看堆栈跟踪之后。 下面是我对 CoordinatorImp.java 中的警报方法所做的更改(在 Atomikos 源代码中),这解决了我的问题。

    public void alarm ( AlarmTimer timer )
    {
       try {
            boolean isHeuristic = stateHandler_ instanceof 
              HeurHazardStateHandler 
    || stateHandler_ instanceof HeurAbortedStateHandler
                                      || stateHandler_ instanceof HeurCommittedStateHandler || stateHandler_ instanceof HeurMixedStateHandler;
        if (!(isHeuristic)) {
         stateHandler_.onTimeout ();
        }
        } catch ( Exception e ) {
           LOGGER.logWarning( "Exception on timeout of coordinator " + root_ , e );
        }
       }
    

    【讨论】: