db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kathey Marsden (JIRA)" <derby-...@db.apache.org>
Subject [jira] Created: (DERBY-960) xa_commit results in XAER_NOTA on readonly transaction after xa_prepare returns XA_OK
Date Mon, 13 Feb 2006 06:25:57 GMT
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
    Reporter: Kathey Marsden
 Assigned to: Kathey Marsden 
     Fix For:,,

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.EmbeddedXADataSource ds = new 
    	Connection conn = null;

         conn = ds.getConnection();
        PreparedStatement ps1 = null;
             DatabaseMetaData md = conn.getMetaData() ;
             ps1 = conn.prepareStatement("CREATE TABLE TAB1(COL1 INT NOT NULL)");
        	 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);
        xar1.end(xid1, XAResource.TMSUCCESS);

        int prp1 = xar1.prepare(xid1);

        System.out.println("XAResource.XA_RDONLY" + 
        System.out.println("XAResource.XA_OK" + 
        System.out.println("prp1 is: " + prp1);
        // Commit transaction
        if (prp1 == XAResource.XA_OK)
           xar1.commit(xid1, false);

        // Close physical connection
    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 = null;

	private static void doInsert(Connection conn) throws SQLException
        Statement stmt = conn.createStatement();
		stmt.executeUpdate("Insert into tab1 values(1)");
    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:
For more information on JIRA, see:

View raw message