Sounds more like we need to provide savepoints support for this kind
of stuff. Nested Transactions sound yucky.

Brandon

On 6/3/05, Niels Beekman <[EMAIL PROTECTED]> wrote:
> Yes, but they are not separate, I think the following happens:
> 
> MyDao
>         getObject()
>                 startTransaction()
>                 MyTypeHandlerCallBack.getResult()
>                         MyOtherDao.getOtherObject()
>                                 startTransaction() - state is already active, 
> continue
>                                         // process OtherObject
>                                 commitTransaction() - commits the transaction
>                                 endTransaction() - closes the resultset / 
> statement
>                         GetSomeMoreProperties() - throws an exception, 
> resultset is already closed
>                 commitTransaction()
>                 endTransaction()
> 
> All calls to a DAO are wrapped in a DaoProxy which takes care of the 
> autocommit-behaviour, if you call a DAO within a DAO (via typehandlers), 
> commitTransaction() is called on the DaoContext, which is the same for both 
> DAO's.
> 
> To make this work properly, autocommit should happen on separate contexts, or 
> commitTransaction() should implement some kind of "transaction-depth" i.e. 
> nested transactions.
> 
> Hopefully this clarifies a bit.
> 
> Niels
> 
> ________________________________________
> From: Clinton Begin [mailto:[EMAIL PROTECTED]
> Sent: donderdag 2 juni 2005 0:20
> To: ibatis-user-java@incubator.apache.org
> Subject: Re: Calling DAO within TypeHandlerCallback
> 
> 
> No, but now that you've explained that, it makes sense. With autocommit, 
> you'll get a separate transaction for each call (which makes sense for that 
> semantic).
> 
> This might make a great FAQ entry.
> 
> Clinton
> 
> On 5/31/05, Niels Beekman <[EMAIL PROTECTED]> wrote:
> Update:
> 
> Strange, when I do not use autocommit-semantics and explicitly demarcate my 
> transactions, everything goes fine. Well, at least I have a workaround.
> 
> Until now, I used autocommit-semantics for most of my reads, and only 
> explicitly demarcated when updating/inserting/deleting, should I always use 
> the latter, even for reads?
> 
> Niels
> ________________________________________
> From: Clinton Begin [mailto:[EMAIL PROTECTED]
> Sent: dinsdag 31 mei 2005 17:46
> To: ibatis-user-java@incubator.apache.org
> Subject: Re: Calling DAO within TypeHandlerCallback
> 
> 
> DAOs never touch result sets. So I wonder what you mean by that? Similarly, 
> iBATIS only closes result sets once all columns have been iterated through 
> (and hence all TypeHandlers have been executed). Unfortunately some drivers 
> (like IBM's DB2 driver) like to close resultsets automatically when the last 
> row is read....you're using JTDS, which we've also had a lot of troubling 
> reports about. Just for giggles, can you try either the Microsoft driver or 
> the Sybase driver, depending on which database you're using?
> 
> Cheers,
> Clinton
> 
> On 5/31/05, Niels Beekman <[EMAIL PROTECTED]> wrote:
> Hi, me again :)
> 
> When using a TypeHandlerCallback-implementation that calls the DAO, any
> subsequent property that iBATIS tries to fetch results in the following
> error (this dump occurred with a Date-property):
> 
> java.sql.SQLException: Invalid state, the ResultSet object is closed.
> at
> net.sourceforge.jtds.jdbc.JtdsResultSet.checkOpen (JtdsResultSet.java:284
> )
> at
> net.sourceforge.jtds.jdbc.JtdsResultSet.findColumn (JtdsResultSet.java:86
> 4)
> at
> net.sourceforge.jtds.jdbc.JtdsResultSet.getTimestamp(JtdsResultSet.java:
> 1225)
> at
> org.apache.commons.dbcp.DelegatingResultSet.getTimestamp (DelegatingResul
> tSet.java:261)
> at
> com.ibatis.sqlmap.engine.type.DateTypeHandler.getResult(DateTypeHandler.
> java:44)
> at
> com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.getPrimitiveResul
> tMappingValue( BasicResultMap.java:544)
> at
> com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.getResults(BasicR
> esultMap.java:303)
> at
> com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor
> .java:363)
> at
> com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.
> java:184)
> at
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQu
> ery(GeneralStatement.java :205)
> at
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
> WithCallback(GeneralStatement.java:173)
> at
> com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
> ForObject(GeneralStatement.java :104)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
> apExecutorDelegate.java:561)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject (SqlM
> apExecutorDelegate.java :536)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
> sionImpl.java:97)
> at
> com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject (SqlMapClie
> ntImpl.java:70)
> at
> com.ibatis.dao.client.template.SqlMapDaoTemplate.queryForObject (SqlMapDa
> oTemplate.java:162)
> at
> nl.wis.services.dao.impl.sqlmap.SqlMapBaseDaoTemplate.queryForObject (Sql
> MapBaseDaoTemplate.java:120)
> at <snip>
> 
> When just constructing objects within the handler (as stated in FAQ),
> all goes well. I tried to do some debugging and it seems that the inner
> DAO-call disposes the resultset, which would obviously result in the
> stated error, but I'm not sure this is the case.
> 
> I really like the typehandlers, so hopefully this can be resolved...
> 
> Thanks again,
> 
> Niels
> 
> 
>

Reply via email to