and when the "Page event handlers" does not start an AmbientTransaction ? what happen ? You are working with session but without NH's transaction ?
2010/2/18 Michael Teper <[email protected]> > Fabio, > > My main environment is an ASP.NET application, using session per request > pattern, with a bit of an abstraction on top of NH, so no, actual code is > not a 100% match to the method I sketched up. The session is opened on first > use (rather than explicitly) and is closed in an EndRequest handler. Page > event handlers use TransactionScope, so the effective life cycle of an NH > session looks more like this: > > - new TransactionScope() > - OpenSession > - session.SaveOrUpdate > - scope.Complete > - session.Close > > This works, but I wanted to make sure I am not moving too far from the > correct pattern. Based on Ayende's response, sounds like we should be OK. > Right? > > Thank you! > -Michael > > ------------------------------ > *From:* [email protected] [ > [email protected]] On Behalf Of Fabio Maulo [ > [email protected]] > *Sent:* Thursday, February 18, 2010 3:21 PM > > *To:* [email protected] > *Subject:* Re: [nhibernate-development] Re: > AdoNetWithDistrubtedTransactionFactory > > Michael, > Perhaps my questions does not sound as a support request but even so an > answer will be appreciate and may help some user. > > 2010/2/18 Fabio Maulo <[email protected]> > >> questions: >> Are you managing the NH's session and trasaction at the same level of >> ambient transaction ? >> Where you are opening a NH's session and NH's transaction should you be >> aware of ambient transaction ? >> >> Where I'm managing the NH's session and NH's transaction I can't, and I >> wouldn't, be aware if it happen in an AmbientTransaction or not. >> Have you some place where the code in your app. look like that you sent us >> ? >> >> >> 2010/2/18 Michael Teper <[email protected]> >> >> Fabio, >>> >>> Does that mean the correct pattern is: >>> >>> public void DoSomething() >>> { >>> using (var scope = new TransactionScope()) >>> { >>> var s = SessionFactory.OpenSession(); >>> s.BeginTransaction(); >>> >>> var foo = s.Get<Foo>(); >>> foo.Prop = "bar"; >>> s.SaveOrUpdate(foo); >>> >>> s.CommitTransaction(); >>> scope.Complete(); >>> } >>> } >>> >>> If so, why are BeginTransaction and CommitTransaction needed? They feel >>> redundant... >>> >>> Thank you! >>> -Michael >>> >>> >>> ------------------------------ >>> *From:* [email protected] [ >>> [email protected]] On Behalf Of Fabio Maulo [ >>> [email protected]] >>> *Sent:* Thursday, February 18, 2010 6:53 AM >>> >>> *To:* [email protected] >>> *Subject:* Re: [nhibernate-development] Re: >>> AdoNetWithDistrubtedTransactionFactory >>> >>> In order to use NH correctly you should: >>> 1) throw away the session after an exception >>> 2) use the NH's transaction >>> >>> Use NH's transaction mean: >>> 1) open the session inside a transactionscope >>> 2) after open the session begin a NH's transaction using >>> session.BeginTransaction >>> >>> 2010/2/18 Sathish Naga <[email protected]> >>> >>>> The test is reflecting the way I use the NH session and transaction >>>> scope. >>>> >>>> When I run the test with the default transaction >>>> factory(AdoNetWithDistrubtedTransactionFactory), it fails on first >>>> session.Clear. >>>> >>>> When I override the Session Factory to use the AdoTransactionFactory, >>>> sample test didn't fail on first session.Clear(). >>>> >>>> I have the test as patch, if you want I can send/upload it. >>>> >>>> Thanks >>>> Sathish >>>> >>>> On Feb 17, 9:51 pm, Fabio Maulo <[email protected]> wrote: >>>> > Where is the NH's transaction ? (ITransaction) >>>> > I mean... you said you have a issue >>>> > with AdoNetWithDistrubtedTransactionFactory but in your code you >>>> haven't use >>>> > it, so... where is the issue ? >>>> > >>>> > 2010/2/17 Sathish Naga <[email protected]> >>>> > >>>> > >>>> > >>>> > >>>> > >>>> > > Hi, >>>> > >>>> > > I've a issue with NHibernate 2.1x and >>>> > > AdoNetWithDistrubtedTransactionFactory and SessionImpl. >>>> > >>>> > > To give you background of my Infrastructure, I have a NH session >>>> > > created per web request. >>>> > >>>> > > On Begin Request I create a Session and On End Request, I clear and >>>> > > dispose the NH session. >>>> > >>>> > > using (ISession s = sessions.OpenSession()) >>>> > > { >>>> > > s.FlushMode = FlushMode.Commit; >>>> > >>>> > > using (var tx = new >>>> > > TransactionScope(TransactionScopeOption.Required, >>>> > > new TimeSpan(0,0,0,0,10000))) >>>> > >>>> > > // >>>> > > Set timeout to 10 secs >>>> > > { >>>> > > try >>>> > > { >>>> > > s.Save(new Person { CreatedAt = >>>> DateTime.Now}); >>>> > > Thread.Sleep(20000); //Sleep for 20 secs to >>>> timeout >>>> > > the transaction >>>> > > s.Flush(); >>>> > > tx.Complete(); >>>> > > } >>>> > > catch (Exception ex) >>>> > > { >>>> > > //when this transaction fails, clear internal >>>> entity >>>> > > cache on >>>> > > session and move on >>>> > > s.Clear();// >>>> > > } >>>> > > } >>>> > > //This transaction expected to be successful >>>> > > using (var tx = new TransactionScope()) >>>> > > { >>>> > > try >>>> > > { >>>> > > s.Save(new Person { CreatedAt = DateTime.Now >>>> }); >>>> > > s.Flush(); >>>> > > tx.Complete(); >>>> > > } >>>> > > catch (Exception ex) >>>> > > { >>>> > > s.Clear(); >>>> > > } >>>> > > } >>>> > > } >>>> > >>>> > > As i reuse the same session for multiple transactions, when any of >>>> my >>>> > > transaction fails, I want to clear the session internal cache. In >>>> that >>>> > > case when the error is due to TransactionScope it fails on >>>> > > session.clear and brings whole application down. >>>> > >>>> > > Once JIRA is up, I'm going to add this defect. I have the test >>>> > > created, Looks like I cant attach the patch to this mail. >>>> > >>>> > -- >>>> > Fabio Maulo >>>> >>> >>> >>> >>> -- >>> Fabio Maulo >>> >>> >> >> >> -- >> Fabio Maulo >> >> > > > -- > Fabio Maulo > > -- Fabio Maulo
