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

Kathey Marsden commented on DERBY-421:
--------------------------------------

BACKGROUND:
For JCC connections to Network Server, when the user sets the isolaton with 
setTransactionIsolation,   the isolation level is encoded in each subsequent 
statement's package name  rather than being set for the connection.   see 
DRDAStatement.setPkgnamcsn(String pkgnamcsn) for the package name format.   
Network server calls setPrepareIsolation(level) to set prepareIsolationLevel 
when  this occurs and the statement gets prepared with that isolation level.

As I recall,  if the isolation level is  set  with an SQL statement it 
basically overrides the prepare isolation, isolationLevelExplicitlySet gets  
set and the prepareIsolation is ignored. 

I don't  think it can get reset back to false, because that would turn off the 
override.  

In the case you describe I don't quite understand why it would be desirable to 
set the flag to false after updating the state.  If we did, wouldn't that  
cause trouble  if we started another  global transaction later?



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