//----------------------------------------------------------------------------- // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Runtime { using System; using System.Transactions; static class TransactionHelper { public static void ThrowIfTransactionAbortedOrInDoubt(Transaction transaction) { if (transaction == null) { return; } if (transaction.TransactionInformation.Status == TransactionStatus.Aborted || transaction.TransactionInformation.Status == TransactionStatus.InDoubt) { //This will throw TransactionAbortedException/TransactionInDoubtException with corresponding inner exception if any using (TransactionScope scope = new TransactionScope(transaction)) { //empty } } } // If the transaction has aborted then we switch over to a new transaction // which we will immediately abort after setting Transaction.Current public static TransactionScope CreateTransactionScope(Transaction transaction) { try { return transaction == null ? null : new TransactionScope(transaction); } catch (TransactionAbortedException) { CommittableTransaction tempTransaction = new CommittableTransaction(); try { return new TransactionScope(tempTransaction.Clone()); } finally { tempTransaction.Rollback(); } } } public static void CompleteTransactionScope(ref TransactionScope scope) { TransactionScope localScope = scope; if (localScope != null) { scope = null; try { localScope.Complete(); } finally { localScope.Dispose(); } } } } }