私は現在、自分のビジネス エンティティに対して複数の挿入、更新、および削除を必要とするアプリケーションを作成しています。すべてのストアド プロシージャが 1 つの作業単位としてコミットまたはロールバックできることを保証するために、TransactionScope クラスを使用しています。
私の質問は、.NET クラス ライブラリで TransactionScope クラスを使用している場合、COMMIT TRAN と ROLLBACK TRAN も使用する必要があるということです。
私は現在、自分のビジネス エンティティに対して複数の挿入、更新、および削除を必要とするアプリケーションを作成しています。すべてのストアド プロシージャが 1 つの作業単位としてコミットまたはロールバックできることを保証するために、TransactionScope クラスを使用しています。
私の質問は、.NET クラス ライブラリで TransactionScope クラスを使用している場合、COMMIT TRAN と ROLLBACK TRAN も使用する必要があるということです。
いいえ、トランザクションに TransactionScope を使用する場合、明示的なトランザクションは必要ありませんが、接続文字列で設定する必要があることが重要です。Transaction Binding=Explicit Unbind;
完全な詳細はこちらにありますが、そうしないと、最初のいくつかの操作がロールバックされ、最後のいくつかの操作がコミットされる (または、トランザクションの外部で実行される) ことになります。
2005年には必要ありませんが、2000年には必要です。また、通常、トランザクションスコープを「使用中」ブロックに入れます。
2000年以前と2005年で使用すると、パフォーマンスの問題がいくつかあります.
こちらをご覧ください
ありがとう
またはに参加している場合は、TransactionScope
またはを使用して独自のローカル トランザクションを明示的に作成しないCommittableTransaction
ことを強くお勧めします。begin transaction
SqlConnection.BeginTransaction
TransactionScope
/CommittableTransaction
は異なる「ファミリー」であり、begin transaction
/とは相互に排他的ですSqlTransaction
したがって、私はサイフ・カーンに同意しません。System.Transactions が Sql 2000 でパフォーマンスの問題を抱えているのは事実なので、begin transaction
代わりに SqlTransaction を使用することをお勧めします。ただし、それを行う場合は、TransactionScope/CommittableTransaction も使用しないでください。
ちなみに、Marc Gravell が説明した動作は .Net 4.0 で変更されました。Explicit Unbind を使用しない場合でも、一部のコマンドをロールバックして一部をコミットすることはできなくなりました。(ただし、古いバージョンでは Explicit Unbind を使用する必要があるという彼の意見は正しいです)。
You shouldn't need to - it should be handled within the TransactionScope. It does depend a little bit as to exactly what you are doing and how you are handling transaction (explicit or implicit) More HERE