From: | Michael Allman <msa(at)allman(dot)ms> |
---|---|
To: | pgsql-jdbc(at)postgresql(dot)org |
Subject: | prepare() method error |
Date: | 2006-02-12 08:51:50 |
Message-ID: | 20060212031201.V9299@yvyyl |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-jdbc |
Hi all,
I've been testing the XA implementation and found a bug. The
PGXAConnection prepare(Xid) method may return a value of XA_OK when it
should throw an XAException instead. This can lead to an inconsistent TPC
outcome.
For example, if you attempt to insert a row which violates a uniqueness
constraint and then prepare the transaction branch, the prepare() method
returns XA_OK erroneously because the PREPARE TRANSACTION statement
executes without throwing an exception even though the transaction is not
prepared.
As a workaround, I've added a query after the PREPARE TRANSACTION query in
the prepare() method which searches the pg_prepared_xacts table for a row
with the given gid just "prepared". If it doesn't find the corresponding
row, it throws an XAException with a suitable error code (I chose
XA_RBROLLBACK).
It would be cleaner if the driver could determine the success/failure of
the PREPARE TRANSACTION statement from the query itself. For instance,
have the executeUpdate("PREPARE TRANSACTION " ....) return normally if and
only if it actually prepares a transaction. If it doesn't prepare, throw
a meaningful SQLException.
Michael
From | Date | Subject | |
---|---|---|---|
Next Message | Heikki Linnakangas | 2006-02-12 10:54:30 | Re: prepare() method error |
Previous Message | Roman Chervotkin | 2006-02-12 02:48:57 | Re: PostgreSQL 8.1 and Sun Java Studio Creator2 |