Omar のブログでこの興味深い記事を読んでください。Linq to SQL は、コミットされていない読み取りを使用してトランザクションのデッドロックとクエリのタイムアウトの問題を解決します。
ここで解決しようとしている問題は、SQL の意味から、NOLOCK で Select ステートメントを使用するか、SET TRANSACTION LEVEL READ UNCOMMITTED を使用する必要があることです。そうしないと、DB の大量の行がロックされ、エラーが発生します。Omar が使用しているテクノロジは Linq2Sql です。問題は、C# データ アクセス コードでこれをどのように実現して、上記のことが起こらないようにするかということです。
基本的に、この投稿では、Omar は実際のサイトで作業し、SqlProfiler などのツールを使用してテストすることで解決策にたどり着きますが、Javed Hasan は MSDN ドキュメントや Scott Hanselman のブログ投稿などを使用して解決策にたどり着きます。
Omar は、次の使用を提案しています。
using (var db = new DropthingsDataContext2())
{
db.Connection.Open();
db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
var user = db.aspnet_Users.First();
var pages = user.Pages.ToList();
}
ジャベド・ハサンが提案するのに対し
using (new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
//Your db Operation
}
StatckOverflow のようなボリュームの多いサイトで、この特定の問題について皆さんが何をしたか、またはこの点に関してジェフとその関係者が何をしたかを知りたいです。
編集: 最初の投稿を読んだ後、Omar の投稿でいくつか指摘したいことがあります。
- 彼は彼のアプローチで接続の問題に遭遇しましたが、彼はそれを解決しました。彼の投稿を参照してください。
- さらに重要なことに、彼は ADO.NET トランザクションの使用方法を試し、Scott Hanselman が彼のブログに書いたことを試してみたと述べましたが、大量のサイトでは機能せず、パフォーマンスがかなり低下します。Omar 氏は次のように述べています。量のウェブサイト。」