While testing recovery and transaction failures we came across
two related issues, the test scenario is almost the same, I'll file the second issue shortly and update this ticket accordingly.
2 enlisted XAResources (one for each database used by the test),
The prepare phase is successful.
We crash the first database server during the XAResource.commit invocation,
after it has committed it's branch, right before the control flow would return to the XAResource (which as a result throws a XAException.XA_RBCOMMFAIL).
The TM can not know at this point in time, whether the database successfully committed the transaction or not. In this particular case, all changes have been committed.
By definition of the 2PC protocol, the transaction should be considered as "to be committed", because the prepare phase has ended successfully.
But now things go awry:
1. There is a XAResource.rollback() issued to the second XAResource.
2. The client receives a EJBTransactionRolledbackException, although
one branch has been completed.
Note, that our database does not support heuristical completion of a branch at all, i.e. there should be no Heuristic* exception be thrown either.
The correct behavior is, to report the transaction as success to the client, commit all branches. All XAResources which failed during XAResource.commit() are supposed to be recovered in future.