Hi Fabio,
I am not using the NHibernate transactions. I thought I should not
have to because NHibernate will enlist in the TransactionScope
transaction:
http://ayende.com/Blog/archive/2006/06/04/NHibernateAndSystemTransactionsASuccess.aspx

A little more background:
I am using the "OpenSessionInView" method for my session handling in
my asp.net MVC application.
However, the session is opened when it is first needed and is disposed
in the Application_EndRequest method.
I am not opening any NHibernate transactions though.

Do you have any ideas on how to make this work?

Henk


On 14 jan, 22:29, Fabio Maulo <[email protected]> wrote:
> mmm.... where is the Begin and Commit of NH's transaction ?
>
> 2010/1/14 HH <[email protected]>
>
>
>
>
>
> > Hi All,
>
> > I'am trying to find out the best practices for using
> > System.Transactions.TransactionScope with NHibernate.
> > I have created some unit tests to find out what works and what doesn't
> > work. I am stuck with a couple of questions:
>
> > First, when I execute the following code (sorry for dutch naming):
>
> > [TestMethod]
> > public void CanCommitNestedTransactionWhenOuterTransactionIsAborted()
> > {
> >        long medewerkerId1 = 2;
> >        long medewerkerId2 = 3;
> >        string voornaam1;
> >        string voornaam2;
>
> >        // NHibernate Session will be openend on first call to repository
>
> >        IMedewerkerRepository repository = this.CreateRepository();
>
> >        using (TS.TransactionScope scope1 = new TS.TransactionScope()) {
> >                // Update m1 in scope1.
> >                Medewerker m1 = repository.Get(medewerkerId1);
> >                voornaam1 = m1.Voornaam;
> >                m1.Voornaam = DateTime.Now.ToString();
> >                repository.Update(m1);
>
> >                // Update m2 in nested scope2 -> RequiresNew
> >                using (TS.TransactionScope scope2 = new TS.TransactionScope
> > (TransactionScopeOption.RequiresNew)) {
> >                        Medewerker m2 = repository.Get(medewerkerId2);
> >                        voornaam2 = m2.Voornaam;
> >                        m2.Voornaam = DateTime.Now.ToString();
> >                        repository.Update(m2);
>
> >                        scope2.Complete(); // scope 2 is completed
> >                }
>
> >                //NB: scope1 is not completed
> >        }
>
> >        Medewerker mCheck1 = repository.Get(medewerkerId1);
> >        Medewerker mCheck2 = repository.Get(medewerkerId2);
>
> >        Assert.AreEqual(voornaam1, mCheck1.Voornaam);
> >        Assert.AreNotEqual(voornaam2, mCheck2.Voornaam);
>
> >        // TestCleanup will dispose session
> > }
>
> > So scope1 should not be commited and scope2 should (in my opinion) be
> > committed because it is a seperate transaction (RequiresNew). To my
> > supprise both scopes are not committed, why, isn't RequiresNew
> > supported by NHibernate?
>
> > Second question:
>
> > Consider the following test:
>
> > [TestMethod]
> > public void CanRollbackTransaction() {
> >        long medewerkerId = 2;
> >        string voornaam;
>
> >        // NHibernate Session will be openend on first call to repository
>
> >        IMedewerkerRepository repository = this.CreateRepository();
>
> >        using (TS.TransactionScope scope = new TS.TransactionScope()) {
> >                Medewerker m = repository.Get(medewerkerId);
> >                voornaam = m.Voornaam;
>
> >                m.Voornaam = DateTime.Now.ToString();
>
> >                repository.Update(m);
>
> >                //NB: scope is not completed
> >        }
>
> >        Medewerker mCheck = repository.Get(medewerkerId);
>
> >        Assert.AreEqual(voornaam, mCheck.Voornaam);
>
> >        // TestCleanup will dispose session
> > }
>
> > This test does not pass although scope is rollbacked in the database.
> > It looks like the session cache does not get updated (no call to db in
> > NHProf). The second "Get" gets it's value from the cache and that
> > still is the updated (but rollbacked) data. When I create my own
> > wrapper arround TransactionScope and call ISession.Clear() on the
> > current NHibernate session the test passes. But is this the way to go?
>
> > I am a bit stuck on how to use System.Transactions.TransactionScope
> > with NHibernate. I need to use the TransactionScope class because of
> > other db activity outside NHibernate in the same transaction.
>
> > Kind regards,
> > Henk Huisman
>
> > --
> > You received this message because you are subscribed to the Google Groups
> > "nhusers" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<nhusers%[email protected]­>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/nhusers?hl=en.
>
> --
> Fabio Maulo- Tekst uit oorspronkelijk bericht niet weergeven -
>
> - Tekst uit oorspronkelijk bericht weergeven -
-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en.


Reply via email to