2011-08-08 32 views
9

私はTransactionScopeOption.SuppressTransactionScopeOption.Requiredを理解していますが、理解するのは難しいと思います。TransactionScopeOption.RequiresNew私が読んだ最後の説明に基づいて、次の2つのコードブロックは機能的に同じでしょうか?これは、RequiresNewの意味を正確に表していますか?トランザクションの十分な理解を得るためにTransactionScopeOptionsについて:RequiresNew = Suppress + Required?

using (var ts1 = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    DoStuff(); 
    ts1.Complete(); 
} 

using (var ts2 = new TransactionScope(TransactionScopeOptions.Suppress)) 
{ 
    using (var ts3 = new TransactionScope()) 
    { 
    DoStuff(); 
    ts3.Complete(); 
    } 

    ts2.Complete(); // not required but recommended for consistency's sake 
} 

答えて

11

はあなたがthis msdn article

を読むことができるスコープ私はそれらの2がその数を除いて異なるだろうどのように良い説明を見つけることができません作成されるネストされたスコープの種類が異なります。どちらのケースも、トランザクションが既に存在するかどうかに関係なく、同じ量のトランザクションにつながるはずです。私は参照するには良いリソースを見つけることができませんが、私は常にSuppires/Requiredの組み合わせでRequiresNewに行きます。 RequiresNewは基本的に「取引があるかどうかに関係なく、私に新しい取引を与えます」という意味です。

更新: 最初のリンクは、あなたがhere

+0

が既にやったウェイバックアーカイブにそれを見つけることができます壊れたままの場合、それは私にこの印象を与えたものです。引用:「RequiresNew':含まれるコードはトランザクションに依存しますが、独立してコミットまたはロールバックする必要があります。抑止:含まれているコードが独自の補償を実行するので、トランザクションの一部であってはなりません。つまり、RequiresNew TransactionScopeを「コミット」または「ロールバック」することは、外部トランザクションに操作または依存することはできず、どちらも他のトランザクションに影響しません。これはSuppressが内部のRequired TransactionScopeに対して行うべきことです。 – Jaxidian

+0

すべての正直なところ、私は2番目のコードブロックを誤読し、2つのネストされたトランザクションスコープ()を持っていると思っていました(外側のSuppressを見逃しました)。私は – Eddy

+2

を編集します。そして明確にするために... RequiresNewトランザクションをロールバックすると、親TransactionScopeに影響はありません。同様に、親TransactionScopeをロールバックすると、RequiresNewトランザクションに影響しません。申し訳ありませんが、私はこれらのオプションを完全に理解していることを確認したいだけです。これらが混ざり合うと、厄介な副作用(デッドロック、非アトミック操作など)がたくさんあります。 – Jaxidian

関連する問題