I make a cross to the centre for Oren but Steve come running from back and, with a stunning header, Goal!
2010/2/18 Stephen Bohlen <[email protected]> > The simpl(est) synopsis of the reasons for this can be found on the NHProf > site here for reference... > > http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions > > Steve Bohlen > [email protected] > http://blog.unhandled-exceptions.com > http://twitter.com/sbohlen > > > > On Thu, Feb 18, 2010 at 3:49 PM, Fabio Maulo <[email protected]> wrote: > >> 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
