[
http://issues.apache.org/jira/browse/DERBY-960?page=comments#action_12366153 ]
Kathey Marsden commented on DERBY-960:
--------------------------------------
looking at this briefly I noticed the following.
1) Runs ok with EmbeddedXADAtaSource
2) The protocol flows from the client for prepare and commit with and without
the insert are just the same, and setting derby.drda.debug=true it looks like
everything is going through the right path, xid and flags are set correctly
until we get this exception on commit.
javax.transaction.xa.XAException
at
org.apache.derby.jdbc.EmbedXAConnection.commit(EmbedXAConnection.java:425)
at
org.apache.derby.impl.drda.DRDAXAProtocol.commitXATransaction(DRDAXAProtocol.java:310)
at
org.apache.derby.impl.drda.DRDAXAProtocol.commitTransaction(DRDAXAProtocol.java:267)
at
org.apache.derby.impl.drda.DRDAXAProtocol.parseSYNCCTL(DRDAXAProtocol.java:139)
at
org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:906)
at
org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:238)
Sending data
total memory: 2465792 free: 1340328 Sun Feb 12 22:25:07 PST 2006
Attaching repro and some traces in ReadOnlyTran.zip
ReadOnlyTran.java - repro for this issue
readonly.trace.out - client trace output with testcase and exception.
withinsert.trace.out - client trace outputwith insert added
nsreadonly.out - Network Server output with derby.drda.debug=true with the
testcase and exception.
nswithinsert.out - Network Server output with derby.drda.debug=true with the
insert added
> xa_commit results in XAER_NOTA on readonly transaction after xa_prepare
> returns XA_OK
> ---------------------------------------------------------------------------------------
>
> Key: DERBY-960
> URL: http://issues.apache.org/jira/browse/DERBY-960
> Project: Derby
> Type: Bug
> Versions: 10.1.2.3, 10.1.3.0, 10.2.0.0, 10.1.2.2
> Reporter: Kathey Marsden
> Assignee: Kathey Marsden
> Fix For: 10.2.0.0, 10.1.3.0, 10.1.2.3
> Attachments: ReadOnlyTran.zip
>
> xa_commit results in XAER_NOTA on readonly transaction after xa_prepare
> returns XA_OK
> Two phase commit on a read only transaction causes the following error:
> Exception in thread "main" org.apache.derby.client.am.XaException: XAER_NOTA
> : Error executing a XAResource.commit(), Server returned XAER_NOTA
> at
> org.apache.derby.client.net.NetXAResource.throwXAException(NetXAResource.java:728)
> at
> org.apache.derby.client.net.NetXAResource.commit(NetXAResource.java:216)
> at ReadOnlyTran.main(ReadOnlyTran.java:78)
> Caused by: org.apache.derby.client.am.SqlException: Error executing a
> XAResource.commit(), Server returned XAER_NOTA
> at
> org.apache.derby.client.net.NetXAResource.xaRetValErrorAccumSQL(NetXAResource.java:976)
> at
> org.apache.derby.client.net.NetXAResource.commit(NetXAResource.java:204)
> ... 1 more
> The following program shows the problem:
> Uncommenting the insert will cause the test to pass.
> import java.sql.Connection;
> import java.sql.DatabaseMetaData;
> import java.sql.PreparedStatement;
> import java.sql.ResultSet;
> import java.sql.SQLException;
> import java.sql.Statement;
> import javax.sql.XAConnection;
> import javax.transaction.xa.XAException;
> import javax.transaction.xa.XAResource;
> import javax.transaction.xa.Xid;
> import com.ibm.db2.jcc.DB2Xid;
> class ReadOnlyTran
> {
>
> public static void main (String args [])throws Exception
> {
> //org.apache.derby.jdbc.ClientConnectionPoolDataSource ds = new
> org.apache.derby.jdbc.ClientConnectionPoolDataSource();
> org.apache.derby.jdbc.ClientXADataSource ds = new
> org.apache.derby.jdbc.ClientXADataSource();
> //org.apache.derby.jdbc.EmbeddedXADataSource ds = new
> //org.apache.derby.jdbc.EmbeddedXADataSource();
> Connection conn = null;
> ds.setDatabaseName("sample");
> ds.setTraceFile("trace.out");
> ds.setConnectionAttributes("create=true");
> conn = ds.getConnection();
> PreparedStatement ps1 = null;
> try
> {
> DatabaseMetaData md = conn.getMetaData() ;
>
> System.out.println(md.getDatabaseProductVersion());
> System.out.println(md.getDatabaseProductName());
> ps1 = conn.prepareStatement("CREATE TABLE TAB1(COL1 INT NOT
> NULL)");
> ps1.executeUpdate();
> System.out.println("done creating table");
> conn.commit ();
> } catch (SQLException x)
> {
> System.out.println ("table already exists");
> }
>
> XAConnection pc1 = ds.getXAConnection();
> XAResource xar1 = pc1.getXAResource();
> Xid xid1 = createXid(11);
> xar1.start(xid1, XAResource.TMNOFLAGS);
> Connection conn1 = pc1.getConnection();
> doSelect(conn1, 50);
> //doInsert(conn1);
> conn1.close();
> xar1.end(xid1, XAResource.TMSUCCESS);
> int prp1 = xar1.prepare(xid1);
> System.out.println("XAResource.XA_RDONLY" +
> XAResource.XA_RDONLY);
> System.out.println("XAResource.XA_OK" +
> XAResource.XA_OK);
> System.out.println("prp1 is: " + prp1);
> // Commit transaction
> if (prp1 == XAResource.XA_OK)
> xar1.commit(xid1, false);
> // Close physical connection
> pc1.close();
> }
>
>
> private static void doSelect(Connection conn, int deptno)
> throws SQLException
> {
> Statement stmt = conn.createStatement();
> ResultSet rset1 = stmt.executeQuery("select * from tab1");
> while (rset1.next())
> {
> System.out.println("==>: " + rset1.getString(1));
> }
>
> stmt.close();
> stmt = null;
> }
> private static void doInsert(Connection conn) throws SQLException
> {
> Statement stmt = conn.createStatement();
> stmt.executeUpdate("Insert into tab1 values(1)");
> stmt.close();
> }
>
> static Xid createXid(int bids) throws XAException {
> byte[] gid = new byte[1];
> gid[0] = (byte) 9;
> byte[] bid = new byte[1];
> bid[0] = (byte) bids;
> byte[] gtrid = new byte[64];
> byte[] bqual = new byte[64];
> System.arraycopy(gid, 0, gtrid, 0, 1);
> System.arraycopy(bid, 0, bqual, 0, 1);
> Xid xid = new DB2Xid(0x1234, gtrid, bqual);
> return xid;
> }
> }
--
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