« Vista で USB な 101 キーボードを使う | トップページ | 月曜 夜7時、 やつらが帰ってくる! »

2007年10月 9日 (火)

[.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 とユニットテスト

|

« Vista で USB な 101 キーボードを使う | トップページ | 月曜 夜7時、 やつらが帰ってくる! »

プログラミング」カテゴリの記事

コメント

> なんにしても、あちこちの引数に点在していた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分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] TransactionScope とユニットテスト:

« Vista で USB な 101 キーボードを使う | トップページ | 月曜 夜7時、 やつらが帰ってくる! »