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