私はTransactionScopeOption.Suppress
とTransactionScopeOption.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
}
が既にやったウェイバックアーカイブにそれを見つけることができます壊れたままの場合、それは私にこの印象を与えたものです。引用:「RequiresNew':含まれるコードはトランザクションに依存しますが、独立してコミットまたはロールバックする必要があります。抑止:含まれているコードが独自の補償を実行するので、トランザクションの一部であってはなりません。つまり、RequiresNew TransactionScopeを「コミット」または「ロールバック」することは、外部トランザクションに操作または依存することはできず、どちらも他のトランザクションに影響しません。これはSuppressが内部のRequired TransactionScopeに対して行うべきことです。 – Jaxidian
すべての正直なところ、私は2番目のコードブロックを誤読し、2つのネストされたトランザクションスコープ()を持っていると思っていました(外側のSuppressを見逃しました)。私は – Eddy
を編集します。そして明確にするために... RequiresNewトランザクションをロールバックすると、親TransactionScopeに影響はありません。同様に、親TransactionScopeをロールバックすると、RequiresNewトランザクションに影響しません。申し訳ありませんが、私はこれらのオプションを完全に理解していることを確認したいだけです。これらが混ざり合うと、厄介な副作用(デッドロック、非アトミック操作など)がたくさんあります。 – Jaxidian