public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) return; if (System.Transactions.Transaction.Current == null) return; var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); session.AfterTransactionBegin(null); transactionContext.AmbientTransation.TransactionCompleted += delegate(object sender, TransactionEventArgs e) { 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; }; transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }
/// <summary> /// /// </summary> /// <param name="session"></param> public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) { return; } if (System.Transactions.Transaction.Current == null) { return; } var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}. Id: {1}.", transactionContext.AmbientTransation.IsolationLevel, transactionContext.AmbientTransation.TransactionInformation.LocalIdentifier); //session.AfterTransactionBegin(null); if (!session.ConnectionManager.Transaction.IsActive) { transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted = true; session.ConnectionManager.Transaction.Begin(transactionContext.AmbientTransation.IsolationLevel.AsDataIsolationLevel()); } else { logger.Debug("Tx is active"); } transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }
public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) { return; } if (System.Transactions.Transaction.Current == null) { return; } var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); session.AfterTransactionBegin(null); //use pull-request https://github.com/nhibernate/nhibernate-core/pull/206 (with handler manipulation) TransactionCompletedEventHandler handler = null; handler = delegate(object sender, TransactionEventArgs e) { lock (session) { using (new SessionIdLoggingContext(session.SessionId)) { ((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; } transactionContext.AmbientTransation.TransactionCompleted -= handler; } }; transactionContext.AmbientTransation.TransactionCompleted += handler; transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }
/// <summary> /// /// </summary> /// <param name="session"></param> public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) return; if (System.Transactions.Transaction.Current == null) return; var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}. Id: {1}.", transactionContext.AmbientTransation.IsolationLevel, transactionContext.AmbientTransation.TransactionInformation.LocalIdentifier); //session.AfterTransactionBegin(null); if (!session.ConnectionManager.Transaction.IsActive) { transactionContext.ShouldCloseSessionOnDistributedTransactionCompleted = true; session.ConnectionManager.Transaction.Begin(transactionContext.AmbientTransation.IsolationLevel.AsDataIsolationLevel()); } else { logger.Debug("Tx is active"); } transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }
public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) { return; } if (System.Transactions.Transaction.Current == null) { return; } var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); session.AfterTransactionBegin(null); transactionContext.AmbientTransation.TransactionCompleted += delegate(object sender, TransactionEventArgs e) { using (new SessionIdLoggingContext(session.SessionId)) { 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; } }; transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }
public void EnlistInDistributedTransactionIfNeeded(ISessionImplementor session) { if (session.TransactionContext != null) { return; } if (System.Transactions.Transaction.Current == null) { return; } var originatingSession = session.ConnectionManager.Session; if (originatingSession != session) { session.TransactionContext = new DependentContext(); } if (originatingSession.TransactionContext != null) { return; } session = originatingSession; var transactionContext = new DistributedTransactionContext(session, System.Transactions.Transaction.Current); session.TransactionContext = transactionContext; logger.DebugFormat("enlisted into DTC transaction: {0}", transactionContext.AmbientTransation.IsolationLevel); session.AfterTransactionBegin(null); foreach (var dependentSession in session.ConnectionManager.DependentSessions) { dependentSession.AfterTransactionBegin(null); } TransactionCompletedEventHandler handler = null; handler = delegate(object sender, TransactionEventArgs e) { using (new SessionIdLoggingContext(session.SessionId)) { ((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.ConnectionManager.AfterTransaction(); session.AfterTransactionCompletion(wasSuccessful, null); foreach (var dependentSession in session.ConnectionManager.DependentSessions) { dependentSession.AfterTransactionCompletion(wasSuccessful, null); } Cleanup(session); } e.Transaction.TransactionCompleted -= handler; }; transactionContext.AmbientTransation.TransactionCompleted += handler; transactionContext.AmbientTransation.EnlistVolatile(transactionContext, EnlistmentOptions.EnlistDuringPrepareRequired); }