[ http://issues.apache.org/jira/browse/DERBY-1025?page=comments#action_12369590 ]
Kathey Marsden commented on DERBY-1025: --------------------------------------- So on XAResource.start() we need to flowcommit if 1) We are in autocommit mode. conn_.autocommit_ == true 2) We are in a an active local Transaction. conn_getXAState() == XA_T0_NOT_ASSOCIATED conn_.inUnitOfWork_ == true For my first shot at fixing this bug I added the folling code to NetXAResource.start() // DERBY-1025 // autocommit the local transaction before starting the global transaction // if autocommit is set if (conn_.autoCommit_ && conn_.inActiveLocalTransaction()) { conn_.flowAutoCommit(); } Where in NetXAConnection we have public boolean inActiveLocalTransaction() { return (isInUnitOfWork_() && (getXAState() == XA_T0_NOT_ASSOCIATED)); } And in Connection.java /** * @return Returns the inUnitOfWork_. */ public boolean isInUnitOfWork_() { return inUnitOfWork_; } With my change, putting this code in I found some very strange behaviour in this case in XATest 1) I got a commit on start when no local transaction was active after a suspend 2) I seemed to lose a totally different suspended transaction in the process. See comments for behaviour: private static void interleavingTransactions(XADataSource xads) { System.out.println("interleavingTransactions"); try { XAConnection xac = xads.getXAConnection("sku", "testxa"); XAResource xar = xac.getXAResource(); Xid xid1 = XATestUtil.getXid(1, 93, 18); Xid xid2 = XATestUtil.getXid(2, 45, 77); xar.start(xid1, XAResource.TMNOFLAGS); Connection conn = xac.getConnection(); Statement s = conn.createStatement(); s.executeUpdate("insert into APP.foo values (1)"); xar.end(xid1, XAResource.TMSUSPEND); // commit occurred here because inUnitOfWork_ was true // when it should be false. xar.start(xid2, XAResource.TMNOFLAGS); s.executeUpdate("insert into APP.foo values (2)"); xar.end(xid2, XAResource.TMSUSPEND); xar.start(xid1, XAResource.TMRESUME); s.executeUpdate("insert into APP.foo values (3)"); // XAER_NOTA on suspend of xid1. // very strange because the resume worked ok. // where did it go? xar.end(xid1, XAResource.TMSUSPEND); I am trying to understand: 1) When and how inUnitOfWork_ is set and its relation to XA 2) Why the autocommit after the suspension of xid2 caused xid1 to go away after it resumed just fine. All very strange. > [xa] client XAResource.start() does not commit an active local transaction > when auto commit is true > --------------------------------------------------------------------------------------------------- > > Key: DERBY-1025 > URL: http://issues.apache.org/jira/browse/DERBY-1025 > Project: Derby > Type: Bug > Components: Network Client > Reporter: Daniel John Debrunner > Assignee: Kathey Marsden > > Embedded XAResource.start() implementation commits the active local > transaction on the Connection associated with the XAResource if the > connection is auto-commit mode. > Client incorrectly throws an XAException with the XAER_RMFAIL error code (see > DERBY-1024) > XATest contains a work-around for client (calling commit) with a comment with > this bug number. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira