Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 91526 invoked from network); 14 Feb 2006 13:36:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 14 Feb 2006 13:36:52 -0000 Received: (qmail 33074 invoked by uid 500); 14 Feb 2006 13:36:37 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 32918 invoked by uid 500); 14 Feb 2006 13:36:36 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 32771 invoked by uid 99); 14 Feb 2006 13:36:35 -0000 X-ASF-Spam-Status: No, hits=1.3 required=10.0 tests=SPF_FAIL X-Spam-Check-By: apache.org Received: from [192.87.106.226] (HELO ajax.apache.org) (192.87.106.226) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 14 Feb 2006 05:36:35 -0800 Received: from ajax.apache.org (ajax.apache.org [127.0.0.1]) by ajax.apache.org (Postfix) with ESMTP id B8E43DE for ; Tue, 14 Feb 2006 14:36:10 +0100 (CET) Message-ID: <243923744.1139924170754.JavaMail.jira@ajax.apache.org> Date: Tue, 14 Feb 2006 14:36:10 +0100 (CET) From: "Kathey Marsden (JIRA)" To: derby-dev@db.apache.org Subject: [jira] Updated: (DERBY-960) Client xa prepare returns XA_OK instead of XA_RDONLY for a read only transaction In-Reply-To: <531124430.1139811957449.JavaMail.jira@ajax.apache.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N [ http://issues.apache.org/jira/browse/DERBY-960?page=all ] Kathey Marsden updated DERBY-960: --------------------------------- Attachment: derby960_preview.diff Here is a preliminary patch for this issue. For Network Server - Changed DRDAXAProtocol prepareXATransaction to return the return value of prepare in the SYNCCRD The server was always returning XA_OK if prepare did not throw an error instead of passing the return value to the client. For Network Client - Changed NetXAResource() prepare to handle XA_RDONLY returned from the server. It was throwing an exception for any value returned from the server other than XA_OK. ISSUE and QUESTION: This patch is against the trunk, but the fix needs to go to 10.1 With this fix, older clients working with newer servers will now throw an XAException when prepare returns XA_RDONLY because the client side fix is not in place. This is potentially worse than the previous symptom of returning XA_OK. Should we bump the DRDA maintenance id and continue to return XA_OK with older clients, or just put this fix in place and require upgrade of client to the latest 10.1 to get the fix? > Client xa prepare returns XA_OK instead of XA_RDONLY for a read only transaction > --------------------------------------------------------------------------------- > > Key: DERBY-960 > URL: http://issues.apache.org/jira/browse/DERBY-960 > Project: Derby > Type: Bug > Components: Network Client > 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, derby960_preview.diff > > Client xa prepare returns XA_OK instead of XA_RDONLY for a read only transaction > The code below checks the return value of XaResource.prepare to decide whether to commit the transaction. The prepare return value is XA_OK ( 0) for client when it should be XA_RDONLY(3) > D>java ReadOnlyTran derbycli > 10.2.0.0 alpha > Apache Derby > Apache Derby Network Client JDBC Driver > table already exists > ==>: 1 > XAResource.XA_RDONLY3 > XAResource.XA_OK0 > prp1 is: 0 > 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:94) > 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 > D> > 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