ibatis-user-java mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sudhir, Sudhir (Contractor)" <SSud...@moneygram.com>
Subject RE: Nested transactions?
Date Thu, 31 May 2007 13:14:25 GMT
Thanks Clinton,

I am curious about the second approach, I don't think I quite got what
you are saying there...is there an example that you can illustrate or
point to?

 

Thanks,

Sudhir

 

From: Clinton Begin [mailto:clinton.begin@gmail.com] 
Sent: Wednesday, May 30, 2007 8:31 PM
To: user-java@ibatis.apache.org
Subject: Re: Nested transactions?

 

The DAO framework is smart enough to deal with that.  But yeah, you need
to move your transaction management out of those methods.  I understand
the challenge there.  There are at least 3 possible solutions:

1) Move the transaction control up to the web tier or at least higher
than the service layer.  Servlet filters (or struts/webwork filters work
well fot this).  This is the simplest approach and nobody should scare
you out of high level transaction scoping...transactions should be as
broadly scoped as possible.  An easy way to do it is start a transaction
for all POST requests, but not for GET requests -- handle odd cases as
appropriate.  

2) Build your own filtering mechanism into your service layer.  It's
fairly simple, you can copy the dynamic proxy code from the DAO manager
that handles automatic transactions.  Basically the first service method
called becomes the transaction scope, regardless of how many other
services or DAOs it calls.  It can get a little tricky around the nested
stuff (think ThreadLocal) and exception handling, but this is the way I
almost always do it for clients. 

3) Use Spring, it does all of the above.  And Spring 2 has simplified
configuration quite a bit.  :-)

Cheers,
Clinton

On 5/30/07, Sudhir, Sudhir (Contractor) <SSudhir@moneygram.com> wrote:

Thanks,

The only issue that you run into quite often is that you need both
composite services as well as more fine grained services and both these
kinds of services need to be "transaction aware". So you end of creating
"layers on top of the service layer" to delegate and allow for
transactions. Not a problem other than the fact not you have  a set of
methods that do nothing but start and end transactions, just becomes
cumbersome I guess.

So essentially if I wanted to do something to the effect, is my only
option to re-factor such behavior into a different method?:

> ServiceClass1

> public void doSomething() {

>       try {

>              daoManager.startTransaction();

>              // Write some stuff to a database

>              daoManager.commitTransaction();

>       } catch (Exception e) {

>              throw e;

>       } finally {

>              daoManager.endTransaction();

>       }

> }

> 

> ServiceClass2

> public void doSomethingElse() {

>       try {

>              daoManager.startTransaction();

>              ServiceClass1 sc1 = new ServiceClass1();

>              sc1.doSomething();

>              // Write some stuff to a database

>              daoManager.commitTransaction();

>       } catch (Exception e) {

>              throw e;

>       } finally {

>              daoManager.endTransaction();

>       }

> }

Thanks,

-Sudhir

 

From: Clinton Begin [mailto:clinton.begin@gmail.com] 
Sent: Wednesday, May 30, 2007 5:47 PM
To: user-java@ibatis.apache.org
Subject: Re: Nested transactions?

 

Nested transactions are evil*.  iBATIS has a strict policy to use its
powers only for good.  So unfortunately no.  

:-)

Clinton

* Why? See the 'A' in ACID.  http://en.wikipedia.org/wiki/ACID  

On 5/30/07, Sudhir, Sudhir (Contractor) <SSudhir@moneygram.com> wrote: 

Does iBatis support nested transactions?

-Sudhir
----------------------------------------- 

This message may contain confidential information.  If you are not
the intended recipient, please notify the sender immediately and
delete this email from your system.

 

 


Mime
View raw message