【问题标题】:springboot causing 2phase transaction commit when not neededspring boot 在不需要时导致两阶段事务提交
【发布时间】:2015-08-01 06:36:56
【问题描述】:

我有一个独立的应用程序 A,它调用部署在 jboss eap 6.2.3 中的 web 服务 B。 jboss 中的应用程序使用 mysql 数据源。此应用程序集成运行良好。

我需要将独立应用程序本身网络化为 spring rest data jpa 微服务 所以我为那个独立的应用程序 A 编写了一个 Spring Boot 包装器。它在嵌入式 tomcat 中运行并调用在 jboss 中运行的应用程序 B。 我还将一些配置逻辑从属性文件移植到嵌入式 h2 数据库中。

现在在一些地方,我看到下面显示的这个异常,由 jboss 中的应用程序 B 插入到 mysql 中。我的猜测是,之前是一个简单的事务,现在运行良好已经变成了有时会失败的两阶段提交。 如何预防?

Caused by: javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction.
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1177)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
    at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:75)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:92) [jboss-as-ejb3-7.3.3.Final-redhat-SNAPSHOT.jar:7.3.3.Final-redhat-SNAPSHOT]
    ... 67 more
Caused by: org.infinispan.CacheException: Could not prepare. 
    at org.infinispan.transaction.synchronization.SynchronizationAdapter.beforeCompletion(SynchronizationAdapter.java:70) [infinispan-core-5.2.7.Final-redhat-2.jar:5.2.7.Final-redhat-2]
    at com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:76)
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:273)
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:93)
    at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:1165)
    ... 70 more
Caused by: javax.transaction.xa.XAException
    at org.infinispan.transaction.TransactionCoordinator.prepare(TransactionCoordinator.java:161) [infinispan-core-5.2.7.Final-redhat-2.jar:5.2.7.Final-redhat-2]
    at org.infinispan.transaction.TransactionCoordinator.prepare(TransactionCoordinator.java:123) [infinispan-core-5.2.7.Final-redhat-2.jar:5.2.7.Final-redhat-2]
    at org.infinispan.transaction.synchronization.SynchronizationAdapter.beforeCompletion(SynchronizationAdapter.java:68) [infinispan-core-5.2.7.Final-redhat-2.jar:5.2.7.Final-redhat-2]
    ... 75 more

【问题讨论】:

  • 没有足够的信息可以发表评论。您是说异常发生在应用程序B(不是A,您实际上正在升级)中吗?此外,异常源自 Infinispan。您是否使用它在应用程序B 中进行缓存?请发布发生此错误的操作的代码和配置。另请参阅 this document 以配置 Infinispan 以正确使用事务代码。

标签: jboss spring-boot embedded-tomcat-8


【解决方案1】:

Spring Boot 对 JTA 提供了开箱即用的支持。当它在 JTA 事务管理器可用的环境中运行时,它会使用它而不是为您的数据存储创建本地事务管理器。如果这不是您想要的,您可以通过将 spring.jta.enabled=false 添加到您的配置来禁用 jta 支持。

【讨论】:

    【解决方案2】:

    感谢您的回答。在某些情况下会很有用。 但是在发布后我意识到问题的缺陷。

    独立应用程序 A 网络化应用程序(即使是运行 Embeddedtomcat 的微服务)说 A1

    两者实际上只是休息客户端,用于在 jboss eap 6.2.3 中部署的 web 服务 B 中运行的休息服务。

    A 和 A1 也可以被一个简单的人类访问者替换,该访问者从浏览器访问应用程序 B。

    我认为 A 或 A1 不会以任何方式影响 B 的交易。 对吧?

    无论如何,问题是由于应用程序 A1 靠近 B。 实际问题与部署 B 的集群的集群事件以及由 A1 触发它有关。有点复杂的场景。唯一的问题是在集群更改事件甚至可以到达之前就尝试插入太早。

    【讨论】:

    • 或者您是否建议以某种方式将它们放在分布式 tx 中。我不这么认为。如果可能,请写。然而,正如我所说,这种情况下的问题是不同的
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2018-08-15
    • 2015-12-30
    • 2017-10-22
    • 2019-11-03
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    相关资源
    最近更新 更多