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);
		}
示例#2
0
        /// <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);
        }