Opening a Nhibernate session within a TransactionScope should and does have actions performed under that session being enlisted in the current ambient transaction.
I usually don't call session.flush but did in this case and experienced this behaviour. Not calling trx.complete() should rollback the transaction even if session.flush() is invoked. On Aug 26, 12:55 pm, Jason Dentler <[email protected]> wrote: > By the way, calling Session.Flush with "flush on commit" is a good > indication that you are doing something wrong. You should be using an > NHibernate transaction instead. > > On Thu, Aug 26, 2010 at 5:52 AM, Jason Dentler <[email protected]>wrote: > > > First, you must use an NHibernate transaction for all database interaction. > > TransactionScope is not a substitute. > > > Second, TransactionScope should only be used when you need to coordinate > > more than one resource. Even then, you should still use an NHibernate > > transaction as well. > > > Third, TransactionScope allows each resource to vote whether the > > transaction should be rolled back or committed. If everyone votes commit, > > then it's committed. When you use a real NH transaction, you can control > > which way NHibernate will vote. > > > On Thu, Aug 26, 2010 at 1:12 AM, MixMasta <[email protected]> wrote: > > >> I am using a .NET transaction scope and running the following to > >> verify transaction commits/rollbacks > >> Using 2.1 nhibernate talking to SQL server db. > > >> var b1 = new Person {Email = "[email protected]", Username = "art"}; > >> using (var session = NHibernateSession.CurrentFor("MyDatabase")) > >> { > >> session.Save(b1); > >> session.Flush(); > >> } > >> //Writes b1 away to database > > >> using (var tx = new TransactionScope()) > >> { > >> using (var session = NHibernateSession.CurrentFor("MyDatabase")) > >> { > >> var b2 = (Person)session.Load(typeof(Person), b1.Id); > >> b2.Username = "art1234"; > >> session.Flush(); > >> } > >> tx.Complete(); > >> } > > >> using (var session = NHibernateSession.CurrentFor("MyDatabase")) > >> { > >> var b3 = (Person)session.Load(typeof(Person), b1.Id); > >> Assert.IsTrue(b3.Username == "art"); > >> } > > >> If I leave the session.Flush() uncommented the transaction commits > >> even if I have the tx.Complete() commented out - I was expecting the > >> transaction scope to decide whether to commit those changes. If I > >> comment out session.Flush() and don't set tx.Complete() then the > >> transaction rolls back as expected. > > >> My guess is that session.Flush creates its own implicit transaction > >> and commits it and ignores the current .NET transaction scope. > > >> Thanks > > >> -- > >> 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. -- 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.
