[ 
http://issues.apache.org/jira/browse/DERBY-421?page=comments#action_12322756 ] 

Daniel John Debrunner commented on DERBY-421:
---------------------------------------------

Thanks for the explanations and improved comments on the code. I'll submit this 
patch but there are opportunities to reduce the code.

1) Note that the flag you've added is always required to be reset once it is 
read, thus the reset could be combined into the method used to read it,
thus removing the two reset methods.

2) It's possible as well that the read method could instead return the 
isolation level needed to be stored in the BrokeredConnection (logical 
connection). Thus this would remove an extra method call and remove the need 
for the try catch block, as the method returning the isolation level would not 
need to declare throing any exceptions.

3) Possibly the start() and end() methods could get the isolation level (since 
they have a reference to the physical connection as an EmbedConnection) and 
pass it into BrokeredConnection, thus removing the need for the methods added 
to EmbedPooledConnection 

> starting an XA transaction resets the isolation level set with SET CURRENT 
> ISOLATION
> ------------------------------------------------------------------------------------
>
>          Key: DERBY-421
>          URL: http://issues.apache.org/jira/browse/DERBY-421
>      Project: Derby
>         Type: Sub-task
>   Components: JDBC
>     Reporter: Kathey Marsden
>     Assignee: Mamta A. Satoor
>  Attachments: derby421XAIsolation082205.txt, derby421XAIsolation083005.txt
>
> When an XA Transaction is started the isolation level set with SET CURRENT 
> ISOLATION gets reset to CS.
> Embedded setTransactionIsolation  does not have this problem but this problem 
> is the root cause of DERBY-414 because client implements 
> setTransactionIsolation by sending SET CURRENT ISOLATION
> $ java TestSetCurrentIsolation
> Database product: Apache Derby
> Database version: 10.2.0.0 alpha
> Driver name:      Apache Derby Embedded JDBC Driver
> Driver version:   10.2.0.0 alpha
> SET CURRENT ISOLATION = UR
> CURRENT ISOLATION: UR
> getTransactionIsolation:TRANSACTION_READ_UNCOMMITTED:1
> Isolation level after xa start
> CURRENT ISOLATION: CS
> getTransactionIsolation:TRANSACTION_READ_COMMITTED:2
> $
> import java.sql.*;
> import javax.sql.*;
> import javax.transaction.xa.*;
> public class TestSetCurrentIsolation
> {
>     public static void main(String[] args) throws Throwable
>     {
>         try
>         {
>              final org.apache.derby.jdbc.EmbeddedXADataSource ds =
>              new org.apache.derby.jdbc.EmbeddedXADataSource();
>              ds.setDatabaseName("C:\\drivers\\derby\\databases\\SCHEDDB");
>              ds.setUser("dbuser1");
>              ds.setPassword("******");
>             XAConnection xaConn = ds.getXAConnection();
>             Connection conn = xaConn.getConnection();
>             conn.setAutoCommit(true);
>             System.out.println("Database product: " + 
> conn.getMetaData().getDatabaseProductName());
>             System.out.println("Database version: " + 
> conn.getMetaData().getDatabaseProductVersion());
>             System.out.println("Driver name:      " + 
> conn.getMetaData().getDriverName());
>             System.out.println("Driver version:   " + 
> conn.getMetaData().getDriverVersion());
>             Statement stmt = conn.createStatement();
>             System.out.println("SET CURRENT ISOLATION = UR");
>             stmt.executeUpdate("SET CURRENT ISOLATION = UR");
>             showIsolationLevel(conn);
>             conn.setAutoCommit(false);
>             XAResource xaRes = xaConn.getXAResource();
>             Xid xid = new TestXid(1,(byte) 32, (byte) 32);
>             xaRes.start(xid, XAResource.TMNOFLAGS);
>             System.out.println("Isolation level after xa start");
>             showIsolationLevel(conn);
>             
>             xaRes.end(xid, XAResource.TMSUCCESS);
>             xaRes.rollback(xid);
>             conn.close();
>             xaConn.close();
>         }
>         catch (SQLException sqlX)
>         {
>             System.out.println("Error on thread 1.");
>             do sqlX.printStackTrace();
>             while ((sqlX = sqlX.getNextException()) != null);
>         }
>         catch (Throwable th)
>         {
>             System.out.println("Error on thread 1.");
>             do th.printStackTrace();
>             while ((th = th.getCause()) != null);
>         }
>     }
>       /**
>        * @param conn
>        * @throws SQLException
>        */
>       private static void showIsolationLevel(Connection conn) throws 
> SQLException {
>               PreparedStatement ps = conn.prepareStatement("VALUES CURRENT 
> ISOLATION");
>               ResultSet rs = ps.executeQuery();
>               //ResultSet rs = conn.createStatement().executeQuery("VALUES 
> CURRENT ISOLATION");
>               rs.next();
>               System.out.println("CURRENT ISOLATION: " +  rs.getString(1));
>               System.out.println("getTransactionIsolation:" + 
>                                       
> getIsoLevelName(conn.getTransactionIsolation()));                             
>                   
>       }
>       
>       public static String getIsoLevelName(int level)
>       {
>               switch (level) {
>                       case java.sql.Connection.TRANSACTION_REPEATABLE_READ:
>                               return "TRANSACTION_REAPEATABLE_READ:" + level;
>                                       
>                       case java.sql.Connection.TRANSACTION_READ_COMMITTED:
>                               return "TRANSACTION_READ_COMMITTED:" + level;
>                       case java.sql.Connection.TRANSACTION_SERIALIZABLE:
>                               return "TRANSACTION_SERIALIZABLE:" + level;
>                       case java.sql.Connection.TRANSACTION_READ_UNCOMMITTED:
>                               return "TRANSACTION_READ_UNCOMMITTED:" + level;
>               }
>               return "UNEXPECTED_ISO_LEVEL";
>       }
> }

-- 
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