0

データベースとしてSqlServer CE 3.5を使用するWinFormアプリケーションがあります。私は、DB操作のための型付きのデータセットクエリを使用します。この操作にトランザクションを使用する必要があります。問題は、それらが異なるアセンブリに散在していることです。私の質問は、1つのトランザクションですべてを実行するにはどうすればよいですか?ここでの動作例を示します:現在のトランザクションを渡すか、DependentCloneを使用しますか?

//transaction should start here 
this.QueryDb(); 
MyOtherAssembly.myClass.QueryDbForSomethingElse(); 
System.IO.File.Delete(fileName); 
//end transaction 

私はTransactionScopeを使用してと思っていますが、それはこのような状況で働くのでしょうか? File.Delete()が失敗した場合、QueryDbForSomethingElse()ロールバックを意味しますか? Transaction.CurrentまたはTransaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete)をパラメータとして渡し、渡されたパラメータを使用して新しいトランザクションを作成する必要がありますか?

私はこれに関する任意のアイデアをありがとうと思います。

答えて

0

TransactionScopeはアセンブリ全体で動作します。実際にはのコードは実装されていません。のコードが実装されています。むしろ、現在の実行コンテキスト(私が間違っていなければ、現在のスレッド)に結びついています。

しかし、Windowsファイルシステムはトランザクションではないため、トランザクションにコードを登録しようとしても、ファイル操作はそれに関与しません。トランザクショナルファイルシステムを取得するまでは、ファイル操作が必要な場合にACIDトランザクションを保証するアプリケーションを作成することはできません。

代わりに、明示的に補償アクションを実装する必要があります。

FWIWただし、Juval LowyのMSDN Magazineの記事Can't Commit? Volatile Resource Managers in .NET Bring Transactions to the Common Typeを参照してください。

+0

ありがとうございました。 私はトランザクションファイルの削除を必要とせず、私の操作はマルチスレッドではないことを明確にし、追加するべきです。 – dstr

関連する問題