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) <[EMAIL PROTECTED]> 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:[EMAIL PROTECTED] *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)* <[EMAIL PROTECTED]> 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.