I'm bringing this back up because, while the XAER_RMERR works in most cases it fails in at least one.
Consider the scenario where the database is shutdown administratively during
org.postgresql.xa.PGXAConnection.commitPrepared(Xidxid). The driver will throw an XAException with an errorCode of
XAER_RMERRback to the transaction manager. However, the pg_prepared_xacts table will still contain a row for the
transaction.
The method org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid) is invoked by the transaction manager as part of
itscall to javax.transaction.xa.XAResource.commit(..) [1]. This is the JTA mapping of the xa_commit() function from
theXA specification [2]. According to this document, a return of XAER_RMERR means:
An error occurred in committing the work performed on behalf of the transaction
branch and the branch’s work has been rolled back. Note that returning this error
signals a catastrophic event to a transaction manager since other resource
managers may successfully commit their work on behalf of this branch. This error
should be returned only when a resource manager concludes that it can never
commit the branch and that it cannot hold the branch’s resources in a prepared
state. Otherwise, [XA_RETRY] should be returned.
However, since the pg_prepared_xacts table still contains a row for the transaction the XAER_RMERR is not accurate. A
"catastrophic"failure has not occurred. It would be possible for the transaction manager to recover this transaction
oncethe database is available again if XA_RETRY was returned instead.
I think it would be better if commitPrepared could differentiate between errors and return either XAER_RMERR or
XA_RETRYas appropriate. Otherwise just about any failure during commitPrepared will result in unrecoverable
transactionsand require manual intervention to clean up the pg_prepared_xacts table.
[1] http://download.oracle.com/javaee/5/api/javax/transaction/xa/XAResource.html#commit(javax.transaction.xa.Xid,
boolean)
[2] http://pubs.opengroup.org/onlinepubs/009680699/toc.pdf