2016-12-12 7 views
1

私はこのトピックを研究しようとしましたが、私がここに見ているほとんどの質問/回答は、私が本当であると思われるものに反するか、あるいは彼らの応答に矛盾しています。パラレルマルチスレッド非同期EFコールは安全ですか?

私はマルチスレッド環境(2つの使用例:ASP.NETと他のいくつかのWindowsサービス)を持っている場合。私は2つのEF6非同期呼び出しを同時に実行するが、別のUnitOfWork/DbContextを使用するとそれは投げられるだろうか?実際にはそれは決してそうではないようですが、それはここの前の回答とは逆になりますか?

以前は、DbContextが共有されていない限り、ロックはすべて彼がデータベース特権になると考えていました。したがって、テーブル/クエリがブロックされた場合にのみブロックされます。

つまり、これら2つの呼び出しがまったく同時に発生すると仮定します。何が起こるか?

// Request 1 
using (var uow = new UnitOfWork()) 
{ 
    var list = await uow.GetMeSomething().ToListAsync(); 
} 

// Request 2 
using (var uow = new UnitOfWork()) 
{ 
    var list = await uow.GetMeSomething().ToListAsync(); 
} 
+0

おそらく、複数のコンテキスト、つまりMARSを使用すると安全です。有用?しばしばあるわけではない。それらはスループットを*低下させる可能性がはるかに高いです。解決したい実際の問題は何ですか?パフォーマンスを向上させようとしていますか?または、並行処理の問題があり、DbContextが問題だと思いますか? –

+0

IMOそうではありませんが、オブジェクトの大きなリストを取得したい場合などです。 1 000 000の行では、スレッドごとに10000のスレッドを作成し、スレッドが完了すると1つの大きなリストにそれらを作成できます。 – BMaximus

+0

MARSとは何ですか?私はあなたが「めったに役に立たない」と「スループットが低い」という意味を理解していません。あなたは精緻化できますか? – Chris

答えて

1

はい、問題ありません。異なるDbContextを使用している限り、2つ(または任意の数)の同時要求を持つことができます。

同時データベース要求を行うと、あまり役に立ちません。特に、両方の要求が同じスピンニングスタイルのドライブに当たっている場合は、速度の向上が期待できません。

+0

ありがとうございました。この場合、EFはなぜ非同期サポートを行ったのですか?私は、クエリがDBの異なるテーブルにヒットした(つまり、ロックが発生していない)限り、より高いスループットを得ることができると思いました。それは確かに逸話的にそうであるようです。 – Chris

+0

@Chris:Asyncは*呼び出し*アプリケーションがスレッドを解放できるようにします。 –

関連する問題