私はこのトピックを研究しようとしましたが、私がここに見ているほとんどの質問/回答は、私が本当であると思われるものに反するか、あるいは彼らの応答に矛盾しています。パラレルマルチスレッド非同期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();
}
おそらく、複数のコンテキスト、つまりMARSを使用すると安全です。有用?しばしばあるわけではない。それらはスループットを*低下させる可能性がはるかに高いです。解決したい実際の問題は何ですか?パフォーマンスを向上させようとしていますか?または、並行処理の問題があり、DbContextが問題だと思いますか? –
IMOそうではありませんが、オブジェクトの大きなリストを取得したい場合などです。 1 000 000の行では、スレッドごとに10000のスレッドを作成し、スレッドが完了すると1つの大きなリストにそれらを作成できます。 – BMaximus
MARSとは何ですか?私はあなたが「めったに役に立たない」と「スループットが低い」という意味を理解していません。あなたは精緻化できますか? – Chris