Ejemplo n.º 1
0
        /// <summary>
        /// Removes a transaction from the transaction table and terminates it by clearing all its locks.
        /// </summary>
        /// <param name="atomicGroupId">Associated atomic group.</param>
        /// <exception cref="System.ArgumentException">Atomic group is invalid.</exception>
        /// <returns></returns>
        public bool RemoveTransaction(long atomicGroupId)
        {
            //
            // Check arguments.
            //
            if (0 > atomicGroupId)
            {
                throw new ArgumentException(StringResources.Error_InvalidAtomicGroup, "atomicGroupId");
            }
            ReadWriteTransaction rwtx      = null;
            bool noActiveTransactionsFound = false;

            //
            // Remove transaction before releasing the transaction locks.
            //
            this.stateLock.EnterWriteLock();
            bool exists = this.rwTransactions.ContainsKey(atomicGroupId);

            if (exists)
            {
                rwtx = this.rwTransactions[atomicGroupId];
                this.rwTransactions.Remove(atomicGroupId);
                noActiveTransactionsFound = (0 == this.rwTransactions.Count && !this.status);
                if (!this.status)
                {
                    AppTrace.TraceSource.WriteNoise(
                        "TransactionManager.RemoveTransaction",
                        "{0} {1} transactions remaining",
                        this.owner,
                        this.rwTransactions.Count);
                }
            }
            this.stateLock.ExitWriteLock();
            if (exists)
            {
                AppTrace.TraceSource.WriteNoise(
                    "TransactionManager.RemoveTransaction",
                    "({0}, {1})",
                    this.owner,
                    atomicGroupId);
                //
                // Release transaction locks.
                //
                rwtx.Terminate();
                //
                // Complete the close if it is in progress.
                //
                if (noActiveTransactionsFound)
                {
                    AppTrace.TraceSource.WriteNoise("TransactionManager.RemoveTransaction", "{0} transactions drained", this.owner);
                    this.drainAllRwTransactions.SetResult(true);
                }
            }
            return(exists);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Removes a transaction from the transaction table and terminates it by clearing all its locks.
        /// </summary>
        /// <param name="transaction">Transaction to terminate.</param>
        /// <exception cref="System.ArgumentNullException">Transaction is null.</exception>
        /// <exception cref="System.ArgumentException">Transaction type is unknown.</exception>
        /// <returns></returns>
        public bool RemoveTransaction(ITransaction transaction)
        {
            //
            // Check arguments.
            //
            if (null == transaction)
            {
                throw new ArgumentNullException("transaction");
            }
            //
            // Done, if transaction is read only.
            //
            if (transaction is IReadOnlyTransaction)
            {
                ReadOnlyTransaction rotx = transaction as ReadOnlyTransaction;
                if (null == rotx)
                {
                    throw new ArgumentException(StringResources.Error_InvalidTransaction, "transaction");
                }
                //
                // Release transaction locks.
                //
                rotx.Terminate();
                return(false);
            }
            //
            // Done, if transaction is trivial.
            //
            ReadWriteTransaction rwtx = transaction as ReadWriteTransaction;

            if (null == rwtx)
            {
                throw new ArgumentException(StringResources.Error_InvalidTransaction, "transaction");
            }
            if (FabricReplicatorEx.InvalidAtomicGroupId == rwtx.AtomicGroupId)
            {
                //
                // Release transaction locks.
                //
                rwtx.Terminate();
                return(false);
            }
            return(this.RemoveTransaction(rwtx.AtomicGroupId));
        }