예제 #1
0
        /// <summary>
        /// Gets an enlistment into the ambient transaction, if one exists.
        /// </summary>
        /// <returns>An enlistment into the ambient transaction, or <c>null</c> if there is no ambient
        /// transaction.</returns>
        private TransactionEnlistment GetEnlistment()
        {
            Transaction           txTransaction = Transaction.Current;
            TransactionEnlistment enlEnlistment = null;;

            if (txTransaction != null)
            {
                lock (m_objEnlistmentLock)
                {
                    if (m_dicEnlistments == null)
                    {
                        m_dicEnlistments = new Dictionary <string, TransactionEnlistment>();
                    }

                    if (m_dicEnlistments.ContainsKey(txTransaction.TransactionInformation.LocalIdentifier))
                    {
                        enlEnlistment = m_dicEnlistments[txTransaction.TransactionInformation.LocalIdentifier];
                    }
                    else
                    {
                        enlEnlistment = new TransactionEnlistment(txTransaction, this);
                        m_dicEnlistments.Add(txTransaction.TransactionInformation.LocalIdentifier, enlEnlistment);
                    }
                }
            }
            else
            {
                enlEnlistment = new TransactionEnlistment(null, this);
            }

            return(enlEnlistment);
        }
예제 #2
0
        /// <summary>
        /// Gets an enlistment into the ambient transaction, if one exists.
        /// </summary>
        /// <returns>An enlistment into the ambient transaction, or <c>null</c> if there is no ambient
        /// transaction.</returns>
        private TransactionEnlistment GetEnlistment()
        {
            var transaction = Transaction.Current;
            TransactionEnlistment enlistment;

            if (transaction != null)
            {
                lock (EnlistmentLock)
                {
                    if (_enlistments == null)
                    {
                        _enlistments = new Dictionary <string, TransactionEnlistment>();
                    }

                    if (_enlistments.ContainsKey(transaction.TransactionInformation.LocalIdentifier))
                    {
                        enlistment = _enlistments[transaction.TransactionInformation.LocalIdentifier];
                    }
                    else
                    {
                        enlistment = new TransactionEnlistment(transaction, this);
                        _enlistments.Add(transaction.TransactionInformation.LocalIdentifier, enlistment);
                    }
                }
            }
            else
            {
                enlistment = new TransactionEnlistment(null, this);
            }

            return(enlistment);
        }
예제 #3
0
        private void EnsureEnslistment()
        {
            AssertNotDisposedOrDisposing();

            if (Transaction.Current == null)
            {
                throw new InvalidOperationException("You must use TransactionScope when using Rhino.Queues");
            }

            if (CurrentlyEnslistedTransaction == Transaction.Current)
            {
                return;
            }
            // need to change the enslitment
#pragma warning disable 420
            Interlocked.Increment(ref currentlyInsideTransaction);
#pragma warning restore 420
            Enlistment = new TransactionEnlistment(queueStorage, () =>
            {
                lock (newMessageArrivedLock)
                {
                    Monitor.PulseAll(newMessageArrivedLock);
                }
#pragma warning disable 420
                Interlocked.Decrement(ref currentlyInsideTransaction);
#pragma warning restore 420
            }, AssertNotDisposed);
            CurrentlyEnslistedTransaction = Transaction.Current;
        }
예제 #4
0
 public void Rollback(TransactionEnlistment enlistment)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, enlistment.EnlistmentId, "Sending Rollback to transaction manager");
     }
     this.coordination.Rollback(enlistment.Enlistment, this.rollbackResponseCallback, enlistment);
 }
예제 #5
0
 public void ForgetResponse(TransactionEnlistment enlistment, Status status)
 {
     if (DebugTrace.Info)
     {
         DebugTrace.TxTrace(TraceLevel.Info, enlistment.EnlistmentId, "Replying {0} to transaction manager's Forget", status);
     }
     enlistment.DeliverCallback(status);
 }
예제 #6
0
 protected StateMachine(TransactionEnlistment enlistment)
 {
     this.enlistment      = enlistment;
     this.state           = enlistment.State;
     this.synchronization = new SynchronizationManager(this);
     if (DebugTrace.Warning || DiagnosticUtility.ShouldTraceWarning)
     {
         this.history = new StateMachineHistory();
     }
 }
예제 #7
0
        public void Rollback(Enlistment enlistment, ProtocolProviderCallback callback, object obj)
        {
            ParticipantEnlistment protocolProviderContext = enlistment.ProtocolProviderContext as ParticipantEnlistment;

            if (protocolProviderContext != null)
            {
                protocolProviderContext.StateMachine.Enqueue(new TmRollbackEvent(protocolProviderContext, callback, obj));
            }
            else
            {
                TransactionEnlistment enlistment3 = (TransactionEnlistment)enlistment.ProtocolProviderContext;
                enlistment3.StateMachine.Enqueue(new TmAsyncRollbackEvent(enlistment3, callback, obj));
            }
        }
예제 #8
0
        private void EnsureEnlistment()
        {
            AssertNotDisposedOrDisposing();

            if (Transaction.Current == null)
            {
                throw new InvalidOperationException("You must use TransactionScope when using LightningQueues");
            }

            if (_currentlyEnslistedTransaction == Transaction.Current)
            {
                return;
            }
            // need to change the enlistment
            Interlocked.Increment(ref _currentlyInsideTransaction);
            _enlistment = new TransactionEnlistment(_queueStorage, OnTransactionComplete, AssertNotDisposed);
            _currentlyEnslistedTransaction = Transaction.Current;
        }
		/// <summary>
		/// Gets an enlistment into the ambient transaction, if one exists.
		/// </summary>
		/// <returns>An enlistment into the ambient transaction, or <c>null</c> if there is no ambient
		/// transaction.</returns>
		private TransactionEnlistment GetEnlistment()
		{
			Transaction txTransaction = Transaction.Current;
			TransactionEnlistment enlEnlistment = null; ;

			if (txTransaction != null)
			{
				lock (m_objEnlistmentLock)
				{
					if (m_dicEnlistments == null)
						m_dicEnlistments = new Dictionary<string, TransactionEnlistment>();

					if (m_dicEnlistments.ContainsKey(txTransaction.TransactionInformation.LocalIdentifier))
						enlEnlistment = m_dicEnlistments[txTransaction.TransactionInformation.LocalIdentifier];
					else
					{
						enlEnlistment = new TransactionEnlistment(txTransaction, this);
						m_dicEnlistments.Add(txTransaction.TransactionInformation.LocalIdentifier, enlEnlistment);
					}
				}
			}
			else
				enlEnlistment = new TransactionEnlistment(null, this);

			return enlEnlistment;
		}
예제 #10
0
        public static void RollbackResponse(Enlistment enlistment, Status status, object obj)
        {
            TransactionEnlistment enlistment2 = (TransactionEnlistment)obj;

            enlistment2.StateMachine.Enqueue(new TmRollbackResponseEvent(enlistment2, status));
        }
예제 #11
0
 private void EnsureEnlistment()
 {
     AssertNotDisposedOrDisposing();
     if (Transaction.Current == null)
         throw new InvalidOperationException("You must use TransactionScope when using Rhino.Files");
     if (CurrentlyEnslistedTransaction == Transaction.Current)
         return;
     // need to change the enlistment
     Interlocked.Increment(ref _currentlyInsideTransaction);
     Enlistment = new TransactionEnlistment(_queueStorage, OnTransactionComplete, AssertNotDisposed);
     CurrentlyEnslistedTransaction = Transaction.Current;
 }
 public TmRollbackResponseEvent(TransactionEnlistment enlistment, Microsoft.Transactions.Bridge.Status status) : base(enlistment)
 {
     this.status = status;
 }
 protected SynchronizationEvent(TransactionEnlistment enlistment)
 {
     this.enlistment = enlistment;
     this.state      = enlistment.State;
 }
 public TmAsyncRollbackEvent(TransactionEnlistment enlistment, ProtocolProviderCallback callback, object state) : base(enlistment)
 {
     this.callback      = callback;
     this.callbackState = state;
 }