use it and let me know the difference. NOTE to everybody : session.BeginTransaction mean begin a NH's transaction. NH has two transactionFactory and the default will take care about TS enlisting itself in the TS and will take care about session flush/closeand the others stuff.
2010/1/14 HH <[email protected]> > 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]> > <nhusers%[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]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > > > -- Fabio Maulo--
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.
