I've done a bit more exploration on this.  My sample project used ActiveRecord 
to map the classes and initialize NHibernate.  When I ripped out AR and used 
vanilla NH everything worked as expected.  So it looks like I'll be doing still 
more research and moving this post to the castle list once I find the cause.

From: [email protected] [mailto:[email protected]] On Behalf Of 
Tyler Burd
Sent: Monday, August 03, 2009 11:08 AM
To: [email protected]
Subject: [nhusers] system.transactions problem

I'm having a pretty serious problem with System.Transactions and NH.  I am 
using the trunk, and I can package up a complete test case if no one knows a 
solution off-hand.

Everything works great when I open a session within a TransactionScope, unless 
the transaction is promoted due to something else enlisting in the scope.  I 
have the following test case, with a very simple mapped class.  As you can see, 
my process is:


1.       Begin a TransactionScope

2.       Receive and send a MSMQ message

3.       Open a session

4.       Do some db work within the session

5.       Force a rollback by throwing an exception

6.       Thread.Sleep for 60 seconds.

After about 20 seconds I see the following error occur on another thread:

System.InvalidOperationException: Disconnect cannot be called while a 
transaction is in progress.
at NHibernate.AdoNet.ConnectionManager.Disconnect()
in ConnectionManager.cs: line 
158<about:file%3A%2F%2Fd%3AMiscellaneous%20Files%2Ff%3AConnectionManager.cs%3Fline%3D158%26column%3D1>
...

I have tried both Postgresql with the latest Npgsql driver and MS SQL Server 
2005.  If I take out the MSMQ stuff so that the transaction is NOT promoted, 
everything is fine and dandy.  Any ideas?  Am I doing something wrong here?

[Test]
public void QuickTransactionScopeTest()
{
                var sessionFactory = GetSessionFactory();

                using (var tx = new 
TransactionScope(TransactionScopeOption.RequiresNew))
                {
                                var q = new 
MessageQueue(@".\Private$\somequeue");
                                var msg = q.Receive();
                                q.Send(msg, 
MessageQueueTransactionType.Automatic);

                                using (var sess = sessionFactory.OpenSession())
                                {
                                                try
                                                {
                                                                var dummy = 
sess.Get<TestModel>(1);
                                                                
dummy.TestProperty += "changed!";
                                                                throw new 
Exception("Roll em back, boys.");
                                                                tx.Complete();
                                                }
                                                catch (Exception e)
                                                {
                                                                
Console.WriteLine(e);
                                                }
                                }
                }

                Thread.Sleep(60000);
                Console.WriteLine("Done!");
}




--~--~---------~--~----~------------~-------~--~----~
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