You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by "Sudhir, Sudhir (Contractor)" <SS...@moneygram.com> on 2007/05/30 22:38:35 UTC

Nested transactions?

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.

RE: Nested transactions?

Posted by Chris Lamey <cl...@localmatters.com>.
You could look at how Spring implements their declarative transaction
handling.

On Thu, 2007-05-31 at 08:14 -0500, Sudhir, Sudhir (Contractor) wrote:
> 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) <SS...@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) <SS...@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.
> 
> 
>  
> 
> 
>  
> 
> 

RE: Nested transactions?

Posted by "Sudhir, Sudhir (Contractor)" <SS...@moneygram.com>.
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) <SS...@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) <SS...@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.

 

 


Re: Nested transactions?

Posted by Clinton Begin <cl...@gmail.com>.
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) <SS...@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)* <SS...@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.
>
>
>

RE: Nested transactions?

Posted by "Sudhir, Sudhir (Contractor)" <SS...@moneygram.com>.
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) <SS...@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.

 


Re: Nested transactions?

Posted by Clinton Begin <cl...@gmail.com>.
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) <SS...@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.
>