[jbossts-issues] [JBoss JIRA] (JBTM-2584) Failed commit during one-phase commit optimization only logs warning and lets EJB invocation succeed
Torsten Roemer (JIRA)
issues at jboss.org
Tue Dec 15 07:08:00 EST 2015
[ https://issues.jboss.org/browse/JBTM-2584?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13141173#comment-13141173 ]
Torsten Roemer commented on JBTM-2584:
This issue applies also to the following scenario:
- an XA resource (Oracle datasource) doing "nothing" so outcome of the prepare phase is TwoPhaseOutcome.PREPARE_READONLY
- an XA resource (JCA connector implementing XAResource) throwing an XAException on commit()
One phase commit optimization applies here as well and if XAResource.commit() throws XA_RBROLLBACK, only a warning is logged. This happens also with other error codes such as XAER_RMERR.
So far I've only managed to get the transaction to fail by throwing XA_HEURHAZ from commit() but it seems wrong to me since the transaction did not complete heuristically: one resource didn't have to be committed because it was readonly, and the other failed to commit.
By the way I've tested this on WildFly 10.0.0.CR4 and the behaviour is the same.
> Failed commit during one-phase commit optimization only logs warning and lets EJB invocation succeed
> Key: JBTM-2584
> URL: https://issues.jboss.org/browse/JBTM-2584
> Project: JBoss Transaction Manager
> Issue Type: Bug
> Environment: Ubuntu Linux 32Bit, Java 8, WildFly 8.2.1.Final
> Reporter: Torsten Roemer
> I have an entity manager (Oracle XA datasource) and a JCA resource adapter supporting LocalTransaction in one transaction.
> Following scenario:
> - An entity with values equal to those in the database is merged
> - The commit() of the local-tx resource fails and throws a ResourceException
> All that happens is a warning being logged:
> 00:34:47,619 WARN [com.arjuna.ats.jta] (default task-24) ARJUNA016039: onePhaseCommit on < formatId=131077, gtrid_length=29, bqual_length=36, tx_uid=0:ffff7f000101:25752588:566c9884:209, node_name=1, branch_uid=0:ffff7f000101:25752588:566c9884:211, subordinatenodename=null, eis_name=java:/FileDataSource > (LocalXAResourceImpl at 41ac4d[connectionListener=d5fa3f connectionManager=1e7041 warned=false currentXid=null productName=Generic JCA productVersion=1.0 jndiName=java:/FileDataSource]) failed with exception XAException.XA_RBROLLBACK: 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:180) [ironjacamar-core-impl-1.1.9.Final.jar:1.1.9.Final]
> at com.arjuna.ats.internal.jta.resources.arjunacore.XAOnePhaseResource.commit(XAOnePhaseResource.java:113)
> at com.arjuna.ats.internal.arjuna.abstractrecords.LastResourceRecord.topLevelPrepare(LastResourceRecord.java:152)
> at com.arjuna.ats.arjuna.coordinator.AbstractRecord.topLevelOnePhaseCommit(AbstractRecord.java:428)
> at com.arjuna.ats.arjuna.coordinator.BasicAction.onePhaseCommit(BasicAction.java:2317)
> at com.arjuna.ats.arjuna.coordinator.BasicAction.prepare(BasicAction.java:2110)
> at com.arjuna.ats.arjuna.coordinator.BasicAction.End(BasicAction.java:1481)
> 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.TransactionImple.commitAndDisassociate(TransactionImple.java:1166)
> 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:93) [wildfly-ejb3-8.2.1.Final.jar:8.2.1.Final]
> and the EJB invocation succeeds.
> I would expect the EJB to receive a RollbackException since the commit failed with XAException.XA_RBROLLBACK.
> Debugging BasicAction.prepare(), I can see that because the outcome of prepare is TwoPhaseOutcome.PREPARE_READONLY, one phase commit optimization is applied and onePhaseCommit() is called where the outcome TwoPhaseOutcome.ONE_PHASE_ERROR isn't considered an error as far as I understand.
> Then TwoPhaseOutcome.PREPARE_ONE_PHASE_COMMITTED is returned from BasicAction.prepare().
> I would never expect the EJB invocation to succeed if any participant in the transaction fails to commit.
This message was sent by Atlassian JIRA
More information about the jbossts-issues