[ http://issues.apache.org/jira/browse/IBATIS-259?page=all ]
     
Sven Boden closed IBATIS-259:
-----------------------------

    Resolution: Invalid
     Assign To: Sven Boden

Closed as announced as invalid.

> SqlMapTransactionManager.setUserConnection(null) does not completely restore 
> previous transaction state
> -------------------------------------------------------------------------------------------------------
>
>          Key: IBATIS-259
>          URL: http://issues.apache.org/jira/browse/IBATIS-259
>      Project: iBatis for Java
>         Type: Bug
>   Components: SQL Maps
>     Versions: 2.1.7, 2.1.6, 2.1.5
>     Reporter: Paul Wilton
>     Assignee: Sven Boden

>
> SqlMapTransactionManager.setUserConnection(null) does not completely restore 
> previous transaction state:
> // 0) ... transaction manager setup as below
>     <transactionManager type="JDBC">
>         <dataSource type="JNDI">
>             <property name="DBInitialContext" value="java:comp/env"/>
>             <property name="DBLookup" value="/jdbc/dbname"/>
>         </dataSource>
>     </transactionManager>
> PSEUDO CODE DEMONSTRATING PROBLEM AS FOLLOWS:
> // 1) ... start transaction using DaoManager
>       DaoManager.startTransaction()
>       // perform some query using this transaction:
>         getSqlMapExecutor().queryForList(statementName, parameterObject);
> // 2) ... perform some query with userConnection:       
>       SqlMapExecutor executor = getSqlMapExecutor();
>         SqlMapTransactionManager tm = getSqlMapTransactionManager();
>         Connection userConn = null;
>         try {
>             // get a new connection from pool and set it to autocommit mode 
> true for this query
>             userConn = tm.getDataSource().getConnection();
>             tm.setUserConnection(userConn);
>             // execute the query
>             list = executor.queryForList(statementName, parameterObject);
>         } catch (SQLException e) {
>             // do something
>         } finally {
>             try {
>                 // close the user connection
>                 if (userConn!=null)
>                     userConn.close();
>                 // set the user connection back to null, so any transaction 
> on the other connection can be continued
>                 tm.setUserConnection(null);   // THIS SHOULD RESTORE THE 
> ORGINAL TRANSACTION STATE
>             } catch (SQLException e) {            
>                 // do something
>             }
>         }
> // 3) ... perform another query using orginal transaction:
>         getSqlMapExecutor().queryForList(statementName, parameterObject);
>       // THIS FAILS -  stacktracing with null pointer exception as follows:
>       java.lang.NullPointerException
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.autoEndTransaction(SqlMapExecutorDelegate.java:860)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:617)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:584)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:101)
>       at 
> com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:78)
>       at 
> nz.govt.nzqa.web.persistence.ibatis.sqlmap.BaseDaoImpl.executeQueryForList(BaseDaoImpl.java:63)
> // 4) .. end original transaction using DaoManager - commit or rollback 
>       DaoMoanager.commitTransaction();
>       DaoMoanager.endTransaction();
>       // This never executes due to previous failure
> ------------------
> This failure appears to be caused by 
> SqlMapTransactionManager.setUserConnection(null) failing to restore the 
> original transaction state. 
> In the following methods of class SqlMapExecutorDelegate, 
> pushSession(session) resets the session thus setting the transaction manager 
> for the session to NULL. Consequently when step 3 (above) is executed ibatis 
> stack traces.
>   public void setUserProvidedTransaction(SessionScope session, Connection 
> userConnection) {
>     if (session.getTransactionState() == 
> TransactionState.STATE_USER_PROVIDED) {
>       session.recallTransactionState();
>     }
>     if (userConnection != null) {
>       Connection conn = userConnection;
>       session.saveTransactionState();
>       session.setTransaction(new UserProvidedTransaction(conn));
>       session.setTransactionState(TransactionState.STATE_USER_PROVIDED);
>     } else {
>       session.setTransaction(null);
>       pushSession(session);
>     }
>   }
>   protected void pushSession(SessionScope session) {
>     session.reset();
>     sessionPool.push(session);
>   }
> EXPECTED OPERATION:
> What I expect to happen when setUserConnection(null) is called is that the 
> original transaction (and thus connection) is restored in its entirety so 
> that subsequent queries can be made, and the transaction can be commited (or 
> rolled back) as a unit - with the query made on the user connection outside 
> of this transaction scope.

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