Here is my test code:
using (var session = _sessionFactory.OpenSession())
{
using (var scope = new
TransactionScope(TransactionScopeOption.RequiresNew))
{
using (var tx = _target.BeginTransaction())
{
dog = GenerateDog();
session.Save(dog);
session.Flush();
}
scope.Dispose();
}
}
I have found that if you use the ambient transaction and begin
transaction, you cannot use nHibernate Transaction Rollback. If you
do, you get an exception when you try and Complete or Dispose the
outer scope. Instead just let the nHibernate transaction dispose.
And if you do not Commit the nHibernate transaction, you MUST dispose
the ambient transaction. If you call Complete you get an exception.
Does this sound ok?
On Apr 16, 9:47 am, Iain <[email protected]> wrote:
> Kudos to you Diego, that fixed it!
>
> On Apr 16, 1:05 am, Diego Mijelshon <[email protected]> wrote:
>
>
>
>
>
> > NHibernate transactions will enlist in ambient transactions. And you
> > **must**
> > use transactions for NH data access.
> > Try that and tell us if it works.
>
> > Diego
>
> > On Thu, Apr 15, 2010 at 11:55, Iain <[email protected]> wrote:
> > > I haven't really looked much into the session.BeginTransaction(). I
> > > need use nHibernate with MSMQ and WCF and my feeling is that
> > > session.BeginTransaction will not hock into the WCF transaction. Am I
> > > wrong? I can't find much on it.
>
> > > On Apr 15, 11:59 pm, Diego Mijelshon <[email protected]> wrote:
> > > > I'm not big on ambient transactions... but your I think there's a
> > > > problem
> > > > with your code.
> > > > IMO, it should look like this:
>
> > > > using (TransactionScope tx =
> > > > new TransactionScope(TransactionScopeOption.RequiresNew))
> > > > using (ISession session = sessions.OpenSession())
> > > > using (ITransaction nhtx = session.BeginTransaction())
> > > > {
> > > > W s = new W();
> > > > session.Save(s);
> > > > session.Flush();
> > > > nhtx.Commit();
> > > > }
>
> > > > Try it and see if there's any difference.
>
> > > > Diego
>
> > > > On Thu, Apr 15, 2010 at 01:48, Iain <[email protected]> wrote:
> > > > > Hi All,
>
> > > > > I am having a connection leak when we using the ambient transaction,
> > > > > and the transaction is aborted. That is, I get the exception:
> > > > > System.InvalidOperationException: Timeout expired. The timeout period
> > > > > elapsed prior to obtaining a connection from the pool. This may have
> > > > > occurred because all pooled connections were in use and max pool size
> > > > > was reached.
>
> > > > > I am guessing something is holding onto a reference to the connection,
> > > > > or an internal part of the connection. As adding a watch to following
> > > > > and debug breaking within the transaction also causes this issue.
> > > > > ((System.Data.SqlClient.SqlInternalConnectionTds)
> > > > > ((System.Data.SqlClient.SqlConnection)
> > > > > (session.Connection))._innerConnection)._connectionPool.Count
>
> > > > > Is this a known issue or unsupported? Currently our workaround is to
> > > > > promote the transaction to a distributed transaction which seems to
> > > > > work ok, as per this article:
> > > > >http://davybrion.com/blog/2010/03/msdtc-woes-with-nservicebus-and-nhi.
> > > ..
>
> > > > > Here is the unit test that re-produces the issue:
>
> > > > > [Test]
> > > > > public void CanUseSystemTransactionsToAbort()
> > > > > {
> > > > > for (var i = 0; i < 200; i++)
> > > > > {
> > > > > using (ISession session = sessions.OpenSession())
> > > > > using (TransactionScope tx = new
> > > > > TransactionScope(TransactionScopeOption.RequiresNew))
> > > > > {
> > > > > W s = new W();
> > > > > session.Save(s);
> > > > > session.Flush();
> > > > > }
> > > > > }
> > > > > }
>
> > > > > Cheers,
>
> > > > > Iain
>
> > > > > --
> > > > > 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%252bunsubscr...@googlegroups.com>>
> > > > > .
> > > > > 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]<nhusers%[email protected]>
> > > .
> > > For more options, visit this group at
> > >http://groups.google.com/group/nhusers?hl=en.-Hide quoted text -
>
> > - Show quoted text -
>
> --
> 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
> athttp://groups.google.com/group/nhusers?hl=en.- Hide quoted text -
>
> - Show quoted text -
--
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.