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]