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.
