【问题标题】:Transaction commit error is not captured in EJB codeEJB 代码中未捕获事务提交错误
【发布时间】:2018-06-21 04:36:27
【问题描述】:

当我在flush()之后和commit()之前关闭数据库时,记录了一个异常,但代码没有捕获到:

@Stateless
@TransactionAttribute(TransactionAttributeType.NEVER)
public class OuterService {

    @EJB InnerService innerService;

    public String outerMethod() {
        try {
            innerService.innerMethod();
            return "success";
        } catch (Exception e) {
            return "failure";
        }
    }
}

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class InnerService {

    @PersistenceContext EntityManager em;

    public void innerMethod() {
        em.persist(new Entity());
        em.flush();
    } //put the breakpoint here
}

我在调试模式下运行代码并在刷新之后但在退出事务方法之前设置断点。当执行暂停时,我停止 db 服务,然后恢复代码。

由于以下根本原因记录了异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: commit() 期间的通信链路故障。交易决议 未知。

但它没有被外部 try..catch 块捕获,并且该方法成功完成。似乎 JTA 实现扼杀了异常。如何收到错误通知?

我已经尝试过 BMT 和 CDI 事件,但都没有成功。但是,Java SE 环境中的普通 JDBC 和 JPA(Hibernate,具有内置和 C3p0 池)确实可以工作。

我的设置:Ubuntu 17.10、Wildfly 10、MySQL 5.7.20、Connector/J 5.1.44

这是日志(由于字符限制,删除了一些行):

2018-01-07 12:38:44,980 INFO  [stdout] (default task-1) Hibernate: insert into Entity values ( )
2018-01-07 12:39:06,027 WARN  [org.jboss.jca.core.connectionmanager.listener.TxConnectionListener] (default task-1) IJ000305: Connection error occured: org.jboss.jca.core.connectionmanager.listener.TxConnectionListener@f0b0aed[state=NORMAL managed connection=org.jboss.jca.adapters.jdbc.local.LocalManagedConnection@327b7fd0 connection handles=0 lastReturned=1515316110106 lastValidated=1515316098805 lastCheckedOut=1515316124981 trackByTx=true pool=org.jboss.jca.core.connectionmanager.pool.strategy.OnePool@a4e7bad mcp=SemaphoreConcurrentLinkedQueueManagedConnectionPool@42037075[pool=TestDS] xaResource=LocalXAResourceImpl@306327f6[connectionListener=f0b0aed connectionManager=6110d60 warned=false currentXid=null productName=MySQL productVersion=5.7.20-0ubuntu0.17.10.1 jndiName=java:/datasources/TestDS] txSync=TransactionSynchronization@360457732{tx=TransactionImple < ac, BasicAction: 0:ffff7f000101:-7fd727eb:5a51e37d:1d status: ActionStatus.COMMITTING > wasTrackByTx=true enlisted=true cancel=false}]: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1552)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnection.commit(LocalManagedConnection.java:96)
    at org.jboss.jca.core.tx.jbossts.LocalXAResourceImpl.commit(LocalXAResourceImpl.java:172)
    at com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:96)
    at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:162)
    at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:126)
    at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:89)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:636)
    at InnerService$$$view26.innerMethod(Unknown Source)
    at OuterService.outerMethod(OuterService.java:23)
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52)
    at OuterService$$$view33.outerMethod(Unknown Source)
    at RestManager.test(RestManager.java:112)

2018-01-07 12:39:06,032 WARN  [com.arjuna.ats.jta] (default task-1) ARJUNA016039: onePhaseCommit on < formatId=131077, gtrid_length=47, bqual_length=36, tx_uid=0:ffff7f000101:-7fd727eb:5a51e37d:1d, node_name=mypc, branch_uid=0:ffff7f000101:-7fd727eb:5a51e37d:20, subordinatenodename=null, eis_name=java:/datasources/TestDS > (LocalXAResourceImpl@306327f6[connectionListener=f0b0aed connectionManager=6110d60 warned=false currentXid=null productName=MySQL productVersion=5.7.20-0ubuntu0.17.10.1 jndiName=java:/datasources/TestDS]) failed with exception XAException.XAER_RMFAIL: org.jboss.jca.core.spi.transaction.local.LocalXAException: IJ001156: Could not commit local transaction
    at org.jboss.jca.core.tx.jbossts.LocalXAResourceImpl.commit(LocalXAResourceImpl.java:177)
    at com.arjuna.ats.internal.jta.resources.arjunacore.XAOnePhaseResource.commit(XAOnePhaseResource.java:120)
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.endTransaction(CMTTxInterceptor.java:91)
    at InnerService$$$view26.innerMethod(Unknown Source)
    at OuterService.outerMethod(OuterService.java:23)
    at OuterService$$$view33.outerMethod(Unknown Source)
    at RestManager.test(RestManager.java:112)
    at RestManager$Proxy$_$$_Weld$EnterpriseProxy$.test(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)
Caused by: org.jboss.jca.core.spi.transaction.local.LocalResourceException: Communications link failure during commit(). Transaction resolution unknown.
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnection.commit(LocalManagedConnection.java:103)
    at org.jboss.jca.core.tx.jbossts.LocalXAResourceImpl.commit(LocalXAResourceImpl.java:172)
    ... 248 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1552)
    at org.jboss.jca.adapters.jdbc.local.LocalManagedConnection.commit(LocalManagedConnection.java:96)
    ... 249 more

【问题讨论】:

    标签: database jpa jakarta-ee transactions wildfly


    【解决方案1】:

    我对此进行了调查,在我看来这是一个问题。我在这里创建了 jira:https://issues.jboss.org/browse/JBTM-2983。如果得到确认,请随时关注那里的讨论。

    我希望调用者应该被告知提交期间发生了异常。顺便提一句。如果我需要进一步调查,我会根据您的问题创建一个小型测试项目:https://github.com/ochaloup/catch-ejb-exception-test.git

    【讨论】:

    • 这个问题在 JIRA 中被标记为已解决,所以我想我应该接受这个答案。顺便说一句,这个问题有临时解决方法吗?谢谢!
    • 该问题被标记为已解决,应该是下一个 Narayana 版本 (5.7.3.Final) 的一部分。现在取决于组件升级何时包含在 WildFly 版本中。关于临时解决方法:这很棘手,我不确定是否有一些:/ 会尝试考虑一下。
    【解决方案2】:

    我不确定。可能有多种原因。

    首先我会尝试在你的mysql配置中增加net_write_timeout属性。

    你的异常也是由错误代码XAException.XAER_RMFAIL引起的

    Jboss Javadoc: XAException:

    错误代码表示资源管理器已经失败并且没有 可用。

    所以看来PersistenceContext是因为断点中断而损坏或无效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2013-08-29
      • 2013-04-05
      • 1970-01-01
      • 2017-08-27
      相关资源
      最近更新 更多