ibatis-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Liu (JIRA)" <ibatis-...@incubator.apache.org>
Subject [jira] Commented: (IBATIS-298) implicit commit does not work if there's an explicit commit right before
Date Thu, 08 Jun 2006 17:31:30 GMT
    [ http://issues.apache.org/jira/browse/IBATIS-298?page=comments#action_12415379 ] 

Bill Liu commented on IBATIS-298:
---------------------------------

Thanks Jeff for taking a look at the issue. Yes we revisited the code and found that we do
need to call endTransaction and it's documented in the Ibatis Dao user guide. Previously we
thought it's optional to call the endTransaction. 

> implicit commit does not work if there's an explicit commit right before
> ------------------------------------------------------------------------
>
>          Key: IBATIS-298
>          URL: http://issues.apache.org/jira/browse/IBATIS-298
>      Project: iBatis for Java
>         Type: Bug

>   Components: DAO
>     Versions: 2.1.7
>     Reporter: Bill Liu

>
> We've used Ibatis for over 2 years and this's the bug we just found. Consider this scenario:
> DaoManager.startTransaction()
> //1. db insert 1:
> do db insert 1
> DaoManager.commitTransaction()
> //an implicit transaction
> do db insert 2 without starting a transaction explicitly.
> What we expected was that the 2 transactions should be committed. However, only the first
one was but not the second one. We looked at the source code and found out why:
> in StandardDaoManager
> public void endTransaction() {
>   finally {
>       transactionMode.set(null);
>  ...
> }
> public void commitTransaction() {
>   List ctxList = getContextInTransactionList();
>   Iterator i = ctxList.iterator();
>   while (i.hasNext()) {
>     DaoContext context = (DaoContext) i.next();
>     context.commitTransaction();
>   }
> }
> Notice in the commitTransaction(), the transactionMode is not set to be null.
> Now in the second implicit transaction, in com.ibatis.dao.engine.impl.DaoProxy class,
invoke(Object proxy, Method method, Object[] args) method, 
> if (daoManager.isExplicitTransaction()) {
>         // Just start the transaction (explicit)
>         try {
>           context.startTransaction();
>           result = method.invoke(daoImpl.getDaoInstance(), args);
>         } catch (Throwable t) {
>           throw ClassInfo.unwrapThrowable(t);
>         }
>       } else {
>         // Start, commit and end the transaction (autocommit)
>         try {
>           context.startTransaction();
>           result = method.invoke(daoImpl.getDaoInstance(), args);
>           context.commitTransaction();
> ...
> Now daoManager.isExplicitTransaction() returns true! The result: the transaction is started
for the second query but never committed!

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