バックグラウンド
EntityFrameworkを利用する同じデータアクセスライブラリにアクセスするMVCアプリとWindowsサービスの両方があります。Windowsサービスは、いくつかのテーブルで特定のアクティビティを監視し、いくつかの計算を実行します。
数百のデータベースに対してDALプロジェクトを使用しており、実行時にコンテキストの接続文字列を生成しています。
多くの関数(ストアドプロシージャとEFエンティティを呼び出す.NETメソッドの両方)がありますが、使用しているデータの範囲が非常に集中しているため、相互にブロックする可能性があります。
問題
Windowsサービスは、待つことができないほど重要ではありません。何かをブロックする必要がある場合は、Windowsサービスでブロックできます。System.Transactions
以前、ロックを最小限に抑えるためにトランザクション分離レベルをREAD UNCOMMITTEDに設定する場合の方法である、SOの質問をいくつか見つけました。
私はこれを試しましたが、何が起こっているのか誤解している可能性があるので、いくつかの説明が必要です。
Windowsサービスのメソッドは、次のように構成されています。
private bool _stopMe = false;
public void Update()
{
EntContext context = new EntContext();
do
{
var transactionOptions = new System.Transactions.TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (var transactionScope = new System.Transactions.TransactionScope( System.Transactions.TransactionScopeOption.Required, transactionOptions))
{
List<Ent1> myEnts = (from e....Complicated query here).ToList();
SomeCalculations(myEnts);
List<Ent2> myOtherEnts = (from e... Complicated query using entities from previous query here).ToList();
MakeSomeChanges(myOtherEnts);
context.SaveChanges();
}
Thread.Sleep(5000); //wait 5 seconds before allow do block to continue
}while (! _stopMe)
}
2番目のクエリを実行すると、例外がスローされます。
The underlying provider failed on Open.
Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please
enable DTC for network access in the security configuration for MSDTC using the
Component Services Administrative tool.
The transaction manager has disabled its support for remote/network
transactions. (Exception from HRESULT: 0x8004D024)
そのusingブロックで複数のクエリを呼び出すべきではないと仮定できますか?最初のクエリは問題なく返されました。これは、一度に1つのデータベースで実行されます(実際には、他のインスタンスは異なるスレッドで実行されており、このスレッドの何も他のスレッドに影響を与えません)。
私の質問は、これはどのように使用されるべきか、それとも私が知っておくべきことは他にもあるのかということです。
注意:これは監視機能であるため、繰り返し実行する必要があります。