5

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 の投稿でいくつか指摘したいことがあります。

  1. 彼は彼のアプローチで接続の問題に遭遇しましたが、彼はそれを解決しました。彼の投稿を参照してください。
  2. さらに重要なことに、彼は ADO.NET トランザクションの使用方法を試し、Scott Hanselman が彼のブログに書いたことを試してみたと述べましたが、大量のサイトでは機能せず、パフォーマンスがかなり低下します。Omar 氏は次のように述べています。量のウェブサイト。」
4

4 に答える 4

9

まず第一に、コミットされていない読み取りは避けてください。多くの問題を引き起こす可能性があります。はるかに優れたアプローチは、データベースをスナップショット分離に設定することです。これはジェフがしたことです。

Jeff は基本的に次のように述べています。Jeff は DBA ではありません。幸いなことに、SO には多くの DBA がいます。

Omar のアプローチの問題は、「コミットされていない読み取り」分離レベルの接続が接続プールにリークし、Web サイトに大混乱をもたらす可能性があることです。つまり、read uncommitted でランダム ステートメントが実行される可能性があります。

MS が接続をクリーンアップする機会があるため、Javed アプローチの方がはるかに優れています。

編集Javed のアプローチでパフォーマンスの問題が発生している場合は、独自のトランザクション マネージャーのローリングを検討できます。

おそらくやりたいことがいくつかあります:

  • 現在のトランザクションのスタックを保持する
  • トランザクションがコミットされたときに作成者スレッドにいることを確認します
  • 破棄時にトランザクション分離を以前の状態にリセットする
  • トランザクションがコミットされていない場合は、破棄時にロールバックします。
  • ネストされたロールバックをサポートします。
于 2009-03-09T21:08:20.427 に答える
5

私はMicrosoftのSQLServerグループのツールチームの開発者です。多くのアプリケーションは、トランザクションの一貫性にあまり敏感ではありません。特に、レポートを作成するアプリや、時折一貫性のないデータが世界の終わりではない何かを作成する場合はそうです。もちろん、財務アプリケーションなど、データの不整合に対する許容度が非常に低いものを作成する場合は、他のソリューションを検討することをお勧めします。

コミットされていない読み取りを使用することを選択した場合は、C#の拡張メソッドを使用した便利なソリューションをブログに書きました。

于 2010-07-30T06:56:15.457 に答える
1

{私の(悪い)評判により、コメントを投稿できないため、これを回答にします}

System.Transactions を介して IsolationLevel を使用し、トランザクション ブロック内に新しい Linq コンテキストを作成すると、SQL Server は最終的に DTC を呼び出してトランザクションを調整しようとします。それは私に起こったばかりで、まったく予想外でした。

于 2009-07-30T20:37:47.047 に答える
0

.Net でのトランザクションと DTC の (やや驚くべき) 副作用については、Juval Lowy によるこのドキュメント「.NET Framework 2.0 での System.Transactions の紹介」が非常によく説明されており、まだ完全に有効です (.Net4)。読む価値があります。(コメントを投稿することもできます...できれば。)

于 2011-04-20T09:22:23.997 に答える