The rollback was necessary for Sybase and other databases at the time,  but
possibly none anymore... Regardless, it is solved by setting If you set
commitRequired="false". In the next major version of iBATIS we'll probably
change the default setting.

 

***BUT***

 

Creating the transaction in the first place has nothing to do with Sybase.
It's a common misconception that transactions are only useful for updates.

 

If you are running multiple selects against a transactional database, you
will want to run them in a transaction scope to ensure that you're isolated
from other partial changes to the database (depends on isolation level of
course).

 

For example (pseudocode):

 

int n = select count(*) from categories;

List list = select * from categories;

 

n == list.size() is only guaranteed if both statements were run in an
isolated transaction scope.

 

Clinton

 

From: Michael Schall [mailto:[EMAIL PROTECTED] 
Sent: March-05-08 10:49 AM
To: user-java@ibatis.apache.org
Subject: Re: queryForList/Map/Object... rollbacks

 

I saw the commitRequired, but why are we creating the transaction in the
first place? Or is this a Sybase requirement that the rest of us have had to
live with?

On Wed, Mar 5, 2008 at 11:44 AM, Christopher Lamey <[EMAIL PROTECTED]>
wrote:

Doh!  Forgot about "commitRequired" - been using Spring for everything
lately.

Sorry about that.



On 3/4/08 7:46 PM, "" <> wrote:

> Actually, it is the default behaviour. :-/
>
> It's a combination of both the iBATIS transaction manager default
> configuration and SimpleDataSource.
>
> To make a long story short, in the good old days, some JDBC drivers
> literally required a rollback to "reset" the connection.  *cough* Sybase
> *cough*  But other drivers hissed and booed at the excessive rollbacks.
>
> Thus we added a flag to the iBATIS transaction manager, called
> commitRequired (because commits are equally as aggressive).  Try this:
>
> <transactionManager ...  commitRequired="false">
>
> That combined with a container managed DataSource should eliminate all
> unnecessary rollbacks. If it was already set to false, it is entirely
> possible that SimpleDataSource was entirely responsible for the aggressive
> rollbacks -- thus we should probably make that configurable too.
>
> Clinton
>
> -----Original Message-----
> From: Christopher Lamey [mailto:[EMAIL PROTECTED]
> Sent: March-04-08 5:07 PM
> To: user-java@ibatis.apache.org
> Subject: Re: queryForList/Map/Object... rollbacks
>
> That is not the default iBATIS behavior, I'm guessing your container is
> getting involved.
>
> From what I understand, the SIMPLE datasource type is generally for
> standalone programs, not for apps running in a container.
>
> On 3/4/08 4:20 PM, "Tom Henricksen" <[EMAIL PROTECTED]> wrote:
>
>> Currently we are using JDBC with simple datasource.
>>
>>
>>
>> <transactionManager type="JDBC">
>>
>>             <dataSource type="SIMPLE">
>>
>>
>>
>> But we are transitioning to JNDI datasource.
>>
>>
>>
>> This is just a web application.  I will take a look at the Wiki.
>>
>>
>>
>> So is this default behavior of iBatis to create a transaction and roll
>> it back for even a select?
>>
>>
>>
>> Would JTA change this?
>>
>>
>>
>> Thanks,
>>
>> Tom
>>
>>
>>
>>
>>
>> -----Original Message-----
>> From: Jeff Butler [mailto:[EMAIL PROTECTED]
>> Sent: Tuesday, March 04, 2008 3:53 PM
>> To: user-java@ibatis.apache.org
>> Subject: Re: queryForList/Map/Object... rollbacks
>>
>>
>>
>> What transaction manager are you using?
>>
>> Is this an EJB application with CMT, or just a web application?
>>
>> Have you read the information in the WIKI about configuring iBATIS on
>> WebSphere?
>>
>>
>>
>> http://opensource.atlassian.com/confluence/oss/display/IBATIS/Environmen
>> t+Specific+Information
>>
>>
>>
>> Jeff Butler
>>
>>
>>
>>
>>
>> On Tue, Mar 4, 2008 at 3:32 PM, Tom Henricksen <[EMAIL PROTECTED]> wrote:
>>
>> We are performance monitoring our application and my DBA let me know
>> that we had over 3 MILLION rollbacks in a single day.  We are using
>> WebSphere to DB2 on Win2k3 servers.
>>
>> I looked in our code and could not find anything.  Used p6spy and found
>> that every time queryForXXX is called I received a rollback.  Stepping
>> through the queryForList code in SqlMapExecutorDelegate.java the
>> autoStartTransaction starts a transaction if none is present and since
>> we don't have commitRequired set, the autoEndTransaction will cause a
>> rollback.
>>
>> I assume there is a good reason to start the transaction here.  It seems
>> like extra work creating a transaction that will always be rolled back.
>> Can someone explain why this is good to me so I can forward the
>> information to my DBA?  Any links supporting the argument would be
>> great.  Is there a way to use the queryForXXX without creating a
>> transaction?  I assume it is better to not have commitRequired?
>>
>> Thanks for your time.
>>
>>
>>
>> Tom Henricksen
>> Consultant
>> Advanced Technologies Group, Inc.
>>
>>
>>
>>
>>
>

 

Reply via email to