Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid)
От | Justin Bertram |
---|---|
Тема | Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid) |
Дата | |
Msg-id | 500446595.828372.1309301560262.JavaMail.root@zmail06.collab.prod.int.phx2.redhat.com обсуждение исходный текст |
Ответ на | Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid xid) (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>) |
Ответы |
Re: Possible oversight in org.postgresql.xa.PGXAConnection.commitPrepared(Xid
xid)
|
Список | pgsql-jdbc |
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
В списке pgsql-jdbc по дате отправления: