0

簡単に説明するために、私の問題について説明します。

テーブルがあり、ソフトはトランザクションを使用してテーブルにアクセス (更新、挿入) しています。

問題は、このテーブルで DIRT READ を有効にしたいということです。しかし、ソフトソースを変更できないため、SQL ステートメントで with (nolock) を使用することはできません。そのため、トランザクションを開始するSQLプロセスでダーティリードを有効にすることを考えていました。

ロックされたテーブルにアクセスするステートメントでコマンド「SET ISOLATION LEVEL ...」と「WITH (NOLOCK)」が実行されていることがわかります...それは私が避けようとしているものです。トランザクションを開始するステートメントでダート リードを有効にしたい...

前もって感謝します!

4

1 に答える 1

1
  1. 挿入や更新など、書き込みの分離レベルを変更しても意味がありません。書き込みは、更新するものに対して常に排他ロックを取得します。できることは、read、SELECT ステートメントの分離レベルを変更することです。
  2. ダーティ リードは必要ありません。99% の確率で、ロックされた行でブロックされることが保証されているエンド ツー エンド スキャンが発生する不適切なスキーマとクエリ設計を示しています。解決策は、スキーマを適切に変更し、必要なインデックスを追加してスキャンを回避することです。これには、ソースの変更は必要ありません。
  3. 競合が実際に避けられず、スキーマが正しく設計されているまれなケースの場合、答えはダーティ リードを有効にすることではなく、スナップショット分離を有効にすることです。

    ALTER DATABASE ... SET ALLOW_SNAPSHOT_ISOLATION ON;
    ALTER DATABASE ... SET READ_COMMITTED_SNAPSHOT ON;

スナップショット分離によって導入された行のバージョン管理のオーバーヘッドが目に見える少数の展開では、問題を軽減するために自由に使える専門家がいます。

于 2010-04-19T15:37:52.557 に答える