質問者
プロセス間でトランザクションを管理したい

質問
-
プロセス間でトランザクションを管理したいと考えています。
しかし、.NET Framework 4において標準的な方法が見つけられず、実現できない状態です。
ご存知の方がいらっしゃれば、よい方法をご教示いただけないでしょうか。
よろしくお願いします。
詳細を下記します。利用局面
IISでホストされるWCF WebサービスをVisual Studioユニットテストで呼び出す際の使用を想定しています。
クライアント(VS ユニットテスト)から、データベース(以下DB)を更新するWCF Webサービスを呼び出します。
このとき、テスト終了処理(TestCleanup)において更新されたDBをロールバックしたいと考えています。試行したこと
MSDTCが目的の処理を実現するための鍵になると思って、System.Transactions.TransactionScope をクライアント・サーバーいずれにおいても利用してみました。
擬似コードを下記します。// Client using(var scope = new TransactionScope()) { server.UpdateDb(); } // Server public void UpdateDb() { using(var scope = new TransactionScope()) { db.Update(); scope.Complete(); } }
しかし、事前に想像した通りこの単純な方法では分散トランザクションとならず、サーバー側におけるDBの変更はコミットされてしまいました。
System.Transactions 名前空間の他のクラスの機能、例えばSystem.Transactions.TransactionのEnlist~などをMSDNライブラリーや検索エンジンでのエントリーで確認・調査してみましたが、文面や参考コードなどからは上記目的を実現するものは読み取れませんでした。これは、私の分散トランザクションに関する知識が浅いせいかもしれません。環境および制約
開発環境は以下の通りです。
- Windows 7 Ultimate x64 + IIS 7.5
- .NET Framework 4
- Visual Studio 2010 Ultimate
- SQL Server 2008 Express Edition
WCFはCustomBinding(HttpTransport + BinaryMessageEncoding)で構成しています。
WSHttpBindingなど、WS-AtomicTransactionが利用できる(と考えています)通信はシステム想定環境から利用できません。ユニットテストなので、クライアントとサーバーは同一マシンという前提がとれます。DBも単一インスタンスの単一DBという前提が取れます。
なお、単一プロセスでSystem.Transactions.TransactionScopeが動作していることは確認しています。
すべての返信
-
WCF で分散トランザクションを行うなら、次の記事が参考になるかもしれません。
http://msdn.microsoft.com/ja-jp/magazine/cc163432.aspx
http://www.atmarkit.co.jp/fdotnet/wcf/wcf04/wcf04_02.html
なかむら(http://d.hatena.ne.jp/griefworker) -