From b8d17181ac1a2322e1c79a1ab09460aab3de72e0 Mon Sep 17 00:00:00 2001 From: David Gardiner Date: Tue, 23 Apr 2013 17:09:29 +0930 Subject: [PATCH] NH-3454 Release event handler to facilitate garbage collection --- ...AdoNetWithDistributedTransactionFactory.cs | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs b/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs index 52a6f8cf7dc..83ad5214576 100644 --- a/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs +++ b/src/NHibernate/Transaction/AdoNetWithDistributedTransactionFactory.cs @@ -36,31 +36,36 @@ public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); session.AfterTransactionBegin(null); - transactionContext.AmbientTransation.TransactionCompleted += - delegate(object sender, TransactionEventArgs e) + + TransactionCompletedEventHandler handler = null; + + handler = delegate(object sender, TransactionEventArgs e) + { + using (new SessionIdLoggingContext(session.SessionId)) { - using (new SessionIdLoggingContext(session.SessionId)) + ((DistributedTransactionContext) session.TransactionContext).IsInActiveTransaction = false; + + bool wasSuccessful = false; + try { - ((DistributedTransactionContext)session.TransactionContext).IsInActiveTransaction = false; - - bool wasSuccessful = false; - try - { - wasSuccessful = e.Transaction.TransactionInformation.Status - == TransactionStatus.Committed; - } - catch (ObjectDisposedException ode) - { - logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); - } - session.AfterTransactionCompletion(wasSuccessful, null); - if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) - { - session.CloseSessionFromDistributedTransaction(); - } - session.TransactionContext = null; + wasSuccessful = e.Transaction.TransactionInformation.Status + == TransactionStatus.Committed; + } + catch (ObjectDisposedException ode) + { + logger.Warn("Completed transaction was disposed, assuming transaction rollback", ode); } - }; + session.AfterTransactionCompletion(wasSuccessful, null); + if (transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted) + session.CloseSessionFromDistributedTransaction(); + session.TransactionContext = null; + } + + e.Transaction.TransactionCompleted -= handler; + }; + + transactionContext.AmbientTransation.TransactionCompleted += handler; + transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }