db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mamta A. Satoor (JIRA)" <derby-...@db.apache.org>
Subject [jira] Updated: (DERBY-421) starting an XA transaction resets the isolation level set with SET CURRENT ISOLATION
Date Wed, 31 Aug 2005 04:29:05 GMT
     [ http://issues.apache.org/jira/browse/DERBY-421?page=all ]

Mamta A. Satoor updated DERBY-421:
----------------------------------

    Attachment: derby421XAIsolation083005.txt

Here is another review package with more code comments and little reorganization of the code.
The files changed remain the same
as the previous patch.
M      java\engine\org\apache\derby\impl\sql\conn\GenericLanguageConnectionContext.java
M      java\engine\org\apache\derby\iapi\sql\conn\LanguageConnectionContext.java
M      java\engine\org\apache\derby\iapi\jdbc\BrokeredConnection.java
M      java\engine\org\apache\derby\iapi\jdbc\BrokeredConnectionControl.java
M      java\engine\org\apache\derby\jdbc\EmbedPooledConnection.java
M      java\engine\org\apache\derby\jdbc\EmbedXAConnection.java
M      java\testing\org\apache\derbyTesting\functionTests\tests\jdbcapi\checkDataSource.java
M      java\testing\org\apache\derbyTesting\functionTests\master\checkDataSource.out
M      java\testing\org\apache\derbyTesting\functionTests\master\checkDataSource30.out

This patch gets the isolation level state information in BrokeredConnection in sync with the
Real Connection's isolation level
state. This is necessary because any isolation level changes using SQL do not get to BrokeredConnection
and hence 
BrokeredConnection can end with the incorrect isolation level state. The change adds a new
flag in 
GenericLanguageConnectionContext, namely isolationLevelSetUsingSQLorJDBC. This flag gets set
to true anytime isolation level
is changed using JDBC or SQL. Later, at the start and end of a global transaction, EmbedXAConnection
checks if the flag is
set to true and if yes, it puts the real connection's isolation level into into BrokeredConnection
and then resets the flag
in GenericLanguageConnectionContext. The reason for adding methods for this flag maintenance
in both BrokeredConnection
and EmbedPooledConnection is that BrokeredConnection does not have access to GenericeLanguageConnectionContext
which has
the flag. EmbedPooledConnection does have access to GenericLanguageConnectionContext and hence
the methods in 
BrokeredConnection have to go through EmbedPooledConnection.

I have run the tests and the patch didn't cause any failures.

> 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


Mime
View raw message