The developer as nothing to do with NH's transaction as he have nothing to do with NH's session. The pattern session-per-request is clear enough: request, session and transaction as the same life cycle
2010/2/18 Michael Teper <[email protected]> > Fabio, > > Trying to understand where you are going with your questions. Are you > implying that since TransactionScope can't be guaranteed to exist, NH > transactions should be mandatory? Wouldn't you run into the same problem? > You can't guarantee that a developer uses an NH transaction any more than > you can guarantee the use of TransactionScope. Or am I missing something > entirely? > > -Michael > > ------------------------------ > *From:* [email protected] [ > [email protected]] On Behalf Of Fabio Maulo [ > [email protected]] > *Sent:* Thursday, February 18, 2010 3:49 PM > > *To:* [email protected] > *Subject:* Re: [nhibernate-development] Re: > AdoNetWithDistrubtedTransactionFactory > > Well that is the matter... now try to ask to Ayende what happen when you > are using the session without a NH's transaction even if you are running > read-only queries... > Oren, the ball is for you now ;) (as in football) > > 2010/2/18 Michael Teper <[email protected]> > >> Yes. >> >> -Michael >> >> ------------------------------ >> *From:* [email protected] [ >> [email protected]] On Behalf Of Fabio Maulo [ >> [email protected]] >> *Sent:* Thursday, February 18, 2010 3:39 PM >> >> *To:* [email protected] >> *Subject:* Re: [nhibernate-development] Re: >> AdoNetWithDistrubtedTransactionFactory >> >> 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 >> >> > > > -- > Fabio Maulo > > -- Fabio Maulo
