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); }