[.NET] TransactionScope とユニットテスト
ADO.NET 2.0 から増えた機能の一つに、 TransactionScope クラスがあります。
TransactionScope の Complete() メソッドを呼び出した時点で COMMIT が掛かります。 Complete() を呼び出さずに TransactionScope の using スコープを抜けると ( つまり、 Dispose() すると )、 ROLLBACK が掛かります。
さて、 TransactionScope のスゴイところは、 入れ子に出来る、 というところです。
内側の TransactionScope は、 外側の TransactionScope が開始したトランザクションに自動的に参加します。
そして、 すべての TransactionScope で Complete() メソッドが呼び出されたときだけ、 COMMIT されます。 内側の TransactionScope で COMMIT したつもりになっていても、 外側の TransactionScope で ROLLBACK してしまえば、 ぜんぶチャラになるのです。
これのどこが便利かというと…
データベースに変更を加えるクラスのユニットテストを書く場合、 テスト終了時にテストデータを元に戻しておきたいことがあります。
TransactionScope を使っているクラスをテストするコードは、 そのクラスの中で COMMIT していようとも、 テストコード側 (呼び出し側) で ROLLBACK できるのです。
※ 詳細は本家に f(^^; → [.NET] TransactionScope とユニットテスト
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント
> なんにしても、あちこちの引数に点在していたSqlConnectionとSqlTransactionが奇麗になくなったのは驚き。
VS2008 的には、 というか、 .NET 3.5 的には、 LINQ で書くのが正義なので、 SqlCommand も無くなっちゃいます f(^^;
投稿: biac | 2007年10月10日 (水) 00時16分
今手元にある実験ソリューションでやってみました。
レンタルサーバ相手でもEnlist=falseでいけますね。
コネクションオープン→トランザクションセットが面倒でFactoryに封じ込めましたけど(笑)。
なんにしても、あちこちの引数に点在していたSqlConnectionとSqlTransactionが奇麗になくなったのは驚き。
テストのことを考えずにメインコードが組めるのはいいですね。
テスト側も、スーパークラスでTransactionScopeを張っておくだけでよくなりました(笑)。
投稿: 続・DKな人 | 2007年10月 9日 (火) 22時54分
なんと~。
コネクションやらトランザクションやらを
無駄に引き回す必要がないのオイシイですね。しかも
サンプル観てるとBeginとかしなくてよさげだし…。
…これは使える…w
投稿: DKなひと | 2007年10月 9日 (火) 20時25分