postgresql-jdbc.git / summary / log / commit / refs
commit df09e2bee35e49238d883cc6881deb5d8dea6401
Author: Yao Chunlin <chunlinyao@gmail.com>
Date: Fri Nov 27 00:58:59 2015 +0000
Fix bug when call XAResource.start with TMJOIN flag, the old localAutoCommitMode lost.
org/postgresql/test/xa/XADataSourceTest.java | 28 +++++++++++++++++++++++++++-
org/postgresql/xa/PGXAConnection.java | 18 +++++++++++-------
2 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/org/postgresql/test/xa/XADataSourceTest.java b/org/postgresql/test/xa/XADataSourceTest.java
index 4fd040c7..594ce84f 100644
--- a/org/postgresql/test/xa/XADataSourceTest.java
+++ b/org/postgresql/test/xa/XADataSourceTest.java
@@ -340,7 +340,33 @@ public class XADataSourceTest extends TestCase {
xaRes.end(xid, XAResource.TMSUCCESS);
xaRes.commit(xid, true);
- assertTrue(!conn.getAutoCommit());
+ assertFalse("XaResource should have restored connection autocommit mode after commit or rollback to the initial state.", conn.getAutoCommit());
+
+ // Test true case
+ conn.setAutoCommit(true);
+
+ xid = new CustomXid(15);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.commit(xid, true);
+
+ assertTrue("XaResource should have restored connection autocommit mode after commit or rollback to the initial state.", conn.getAutoCommit());
+
+ }
+
+ public void testRestoreOfAutoCommitEndThenJoin() throws Exception {
+ // Test with TMJOIN
+ conn.setAutoCommit(true);
+
+ Xid xid = new CustomXid(16);
+ xaRes.start(xid, XAResource.TMNOFLAGS);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.start(xid, XAResource.TMJOIN);
+ xaRes.end(xid, XAResource.TMSUCCESS);
+ xaRes.commit(xid, true);
+
+ assertTrue("XaResource should have restored connection autocommit mode after start(TMNOFLAGS) end() start(TMJOIN) and then commit or rollback to the initial state.", conn.getAutoCommit());
+
}
/**
diff --git a/org/postgresql/xa/PGXAConnection.java b/org/postgresql/xa/PGXAConnection.java
index eb27bf59..afaf484e 100644
--- a/org/postgresql/xa/PGXAConnection.java
+++ b/org/postgresql/xa/PGXAConnection.java
@@ -233,14 +233,18 @@ public class PGXAConnection extends PGPooledConnection implements XAConnection,
} else if(state == STATE_ENDED)
throw new PGXAException(GT.tr("Transaction interleaving not implemented"), XAException.XAER_RMERR);
- try
- {
- localAutoCommitMode = conn.getAutoCommit();
- conn.setAutoCommit(false);
- }
- catch (SQLException ex)
+ // Only need save localAutoCommitMode for NOFLAGS, TMRESUME and TMJOIN already saved old localAutoCommitMode.
+ if (flags == TMNOFLAGS)
{
- throw new PGXAException(GT.tr("Error disabling autocommit"), ex, XAException.XAER_RMERR);
+ try
+ {
+ localAutoCommitMode = conn.getAutoCommit();
+ conn.setAutoCommit(false);
+ }
+ catch (SQLException ex)
+ {
+ throw new PGXAException(GT.tr("Error disabling autocommit"), ex, XAException.XAER_RMERR);
+ }
}
// Preconditions are met, Associate connection with the transaction
[parent: e0a9b414eab3]