2012-01-09 28 views
1

.net 2とADO.NETを使用する。TransactionScopeがコミットされているかどうかを調べる

トランザクションがコミットされているかどうかを判断する方法はありますか?理由は、私が変更することができず、アンビエントなトランザクションがあるかもしれないし、そうでないかもしれないレガシーフレームワークに悩まされているからです。周囲のトランザクションがすでにコミットされている場合、次のデータベース呼び出しで例外がスローされることがあります。それがあるかどうかを知る必要があります。

すべてのポインタは素晴らしいでしょう!

おかげ

ヨハン

+1

現在のコードベースの例を投稿すると役立ちます。 – Oded

答えて

2

チェックTransaction.Current.TransactionInformation.StatusTransactionStatus.Active以外の場合は、現在のトランザクションを使用しないでください。

ステータスを取得する前にnullTransaction.Currentをチェックする必要はありません。ステートメントを使用してのTransactionScopeインサイド

、およびスコープへの呼び出しの前に/コンプリート():次のように

2

私が正しく、最も効率的/これを捕捉するために見つけた最高の方法があります。次のように

//Register for the transaction completed event for the current transaction 
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted); 

その後、イベントハンドラ関数を作成します。

/// <summary> 
/// Handles the TransactionCompleted event of the Current control. 
/// </summary> 
/// <param name="sender">The source of the event.</param> 
/// <param name="e">The <see cref="System.Transactions.TransactionEventArgs"/> instance containing the event data.</param> 
static void Current_TransactionCompleted(object sender, TransactionEventArgs e) 
{ 
    if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed) 
    { 
     /// Yay it's committed code goes here! 
    } 
} 

が引用するMSDN

「あなたが代わりに取引のための結果情報を取得するために揮発性の入隊を使用して、このイベントのために登録することができます。 TransactionCompletedEventHandlerデリゲートに渡されるパラメータは、Transactionインスタンスです。次に、特定のインスタンスのTransactionInformationプロパティをクエリして、TransactionInformationのインスタンスを取得できます。そのStatusプロパティCommitted値またはAborted値を持つトランザクションのステータスが含まれます。

関連する問題