you could implement this logic yourself by decorating the session
manager, but this will get messy with tracking how many times open
session is called, and then decrementing the count until you "really"
commit the transaction.  Not to mention if you call transaction.commit
(); the principle of least surprise would dictate that you are
actually committing the transaction.

ATM is very simple to use. add facility, put Transactional attribute
on class, put Transaction attribute on member, Done. Depending on how
you structure your code, you could even register the components to get
a transaction attribute automatically, so you don't have to think
about it. Set and Forget.

Jason

On Feb 17, 5:57 am, Andrew Melnichuk <[email protected]>
wrote:
> Thanks pointing to this. It would work. But what i thought is that it is
> logical to have this stack behavior of Begin/Commit calls right in
> ISessionManager - if only first BeginTransaction() starts new transaction
> and further calls return existing transaction, then only last Commit()
> commits transaction. Same like OpenSession()/Close() methods do. What you
> think?
>
> On Tue, Feb 17, 2009 at 12:41 PM, Germán Schuager <[email protected]>wrote:
>
>
>
> > Use Automatic Transaction Management facility:
> >http://castleproject.org/container/facilities/trunk/nhibernate/transa...
>
> > On Tue, Feb 17, 2009 at 7:32 AM, Andrew Melnichuk <
> > [email protected]> wrote:
>
> >> Hi All.
>
> >> I have several components, which use ISessionManager.
> >> Typical component method is:
> >> using (ISession s = sessMgr.OpenSession())
> >> using (ITransaction tx = s.BeginTransaction())
> >> {
> >>     //save something here...
> >>     tx.Commit();
> >> }
>
> >> But some component methods call other component methods, so i need a kind
> >> of transaction stack behavior:
> >> public void Outer()
> >> {
> >>     using (ISession s = sessMgr.OpenSession())
> >>     using (ITransaction tx = s.BeginTransaction())
> >>     {
> >>         //save something here...
> >>         Inner();
> >>         tx.Commit();
> >>      }
> >> }
>
> >> public void Inner()
> >> {
> >>     using (ISession s = sessMgr.OpenSession())
> >>     using (ITransaction tx = s.BeginTransaction())
> >>     {
> >>        //save something here...
> >>         tx.Commit();
> >>     }
> >> }
>
> >> Inner's BeginTransaction() call returns existing transaction, its ok, but
> >> Inner's Commit() call commits it, so the Outer's Commit() raises exception.
> >> ISessionManager supports nested ISession's, as described here
> >>http://castleproject.org/container/facilities/trunk/nhibernate/usingi....
>
> >> Is there a way to use with nested transactions?
>
> >> --
> >> Best regards,
> >> Andrew Melnichuk
>
> --
> Best regards,
> Andrew Melnichuk
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to