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.

Reply via email to