2016-11-10 1 views
1

処理された例外を持つC#トランザクションはロールバックされますか?コードのこの部分を考慮すると

using(TransactionScope tran = new TransactionScope()) { 

    insertStatementMethod1(); 
    insertStatementMethod2(); 
    // this might fail 
    try { 
     insertStatementMethod3(); 
    } catch (Exception e) { 
     // nothing to do 
    } 

    tran.Complete(); 
} 

はロールバックされようとしてinsertStatementMethod1insertStatementMethod2で行うものですか?いかなる場合でも? とにかく実行したい場合は、取引前にinsertStatementMethod3が失敗するかどうかを確認し、それに基づいてトランザクションコードを作成する必要がありますか?

更新

コードは、私が唯一yourExtraCode()メソッドを編集することができますので、私はできませんyourExtraCode()方法

public void yourExtraCode() { 
    insertStatementMethod1(); 
    insertStatementMethod2(); 

    // this call might fail 
    insertStatementMethod3(); 
} 

を書くために得るこの

using(TransactionScope tran = new TransactionScope()) { 
    // <standard code> 
    yourExtraCode(); 
    // <standard code> 
    tran.Complete(); 
} 

に似ていますトランザクションのスコープにするかどうかを選択します。一つの簡単な可能な解決策は、このようになります:

public void yourExtraCode() { 
    insertStatementMethod1(); 
    insertStatementMethod2(); 

    // this call might fail 
    if (findOutIfIcanInsert()) { // <-- this would come by executing sql query 
     try { 
      insertStatementMethod3(); 
     } catch (Exception e) { 
      // nothing to do 
     } 
    } 
} 

しかし、それは、パフォーマンスに影響を与えるデシベルで物事を見ての必要性が付属しています。 より良い方法がありますか、方法を呼び出す前に調べる必要がありますか? 私は試してみましたが、もちろんトランザクションは期待通りにロールバックされました。

+0

これを確認してください。http://stackoverflow.com/questions/494550/how-does-transactionscope-roll-back-transactions –

+1

実際には、アンビエントトランザクションに参加しないことを選択する可能性があります。下の回答を参照してください。 –

答えて

1

最初の2つのメソッドをトランザクションしたくない場合は、それらをアンビエントトランザクションのスコープから移動してください。

アンビエントトランザクションを開始するコードを制御できない場合は、新しいアンビエントトランザクションを作成することによって抑制することができます。using (var scope = new TransactionScope(TransactionScopeOption.Suppress))

+0

私の例はちょっと単純です。実際には、すでにトランザクション内で呼び出されていたメソッドを記述することになります。私はスコープの開始と終了のコントロールがありませんが、私の呼び出しの周りにif文を書くことができます。しかし、それはパフォーマンスに影響を与えるSQLクエリを伴います。 – DDan

+0

返信uptdated –

関連する問題