[ 
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

Reply via email to