11

SQL Server オンライン ブックで、「リソースの共有 (S) ロックは、読み取り操作が完了するとすぐに解放されます。ただし、トランザクションの分離レベルが反復可能な読み取り以上に設定されているか、ロック ヒントを使用して共有 ( S) トランザクションの間ロックします。」

デフォルトの分離レベル (Read Committed) で、明示的なトランザクションのない行レベルのロックについて話していると仮定すると、「読み取り操作」とは何を指しますか?

  • 単一行のデータの読み取り?
  • 単一の 8k IO ページの読み取り ?
  • または、ロックが作成された完全な Select ステートメントの実行が完了するまで、他にいくつの行が含まれていてもかまいませんか?

注: これを知る必要がある理由は、データ レイヤー Web サービスによって生成された数秒間の読み取り専用の select ステートメントがあり、ページ レベルの共有読み取りロックを作成し、行レベルの排他的更新ロックと競合するためにデッドロックを生成するためです。サーバーを最新の状態に保つ複製プロセスから。選択ステートメントはかなり大きく、多くの副選択があります。ある DBA は、「ロックが保持される時間を短縮するために」複数の小さなステートメント (より短い実行部分) に分割するように書き直すことを提案しています。これは、選択ステートメントが完了するまで共有読み取りロックが保持されることを前提としているため、それが間違っている場合 (行またはページが読み取られるときにロックが解放される場合)、そのアプローチはまったく効果がありません....

4

3 に答える 3

4

実際に見るのは非常に興味深いです。プロファイラーを起動して、いくつかの単純なクエリのロックの取得/解放を追跡することをお勧めします。私はしばらく前にこれをしました、それは次のようなものでした:ページ1を取得します行1を取得します行2を取得します行1を解放します行3を取得します行2を取得しますページ2を取得しますページ1を解放します...

私は100%正しいとは言えないかもしれませんが、それは基本的にアプローチでした。したがって、ロックは行が読み取られた後に解放されます。より正確には、次の行のロックが取得された後に解放されます。これは、トラバーサルの一貫した状態を維持することに関係しているのではないかと思います。

于 2009-06-02T21:15:27.577 に答える
1

同時に 2 つのページ レベルのロックを取得しているとは思えません。イベントが非常に迅速に発生するため、そのようにプロファイラーにのみ表示されると思います。ご想像のとおり、常に 2 つのページ レベルのロックが発生しますが、共有ロックを使用して大規模なクエリを実行すると、2 つのページ レベルのロックが発生することがあり、次のクエリで 1 つのロックが発生することもあります。

SELECT *
FROM sys.dm_tran_locks
WHERE request_session_id = <SPID>

だから、私が起こっていると思うことは次のとおりです。

  1. 取得: データベース共有ロック、テーブル共有ロック、ページ共有ロック
  2. ページが読み取られます...ページのロックを同時に解放し、次のページでロックを取得します

2 つの結果は、sys.dm_tran_lock クエリで時々発生します。2 つの PAGE ロックが表示され、時には 1 つと 3 倍の数が表示されます.. 同時アクション中に何がより速く発生するかによって異なります。

于 2012-01-13T07:47:13.857 に答える