SQL Server オンライン ブックで、「リソースの共有 (S) ロックは、読み取り操作が完了するとすぐに解放されます。ただし、トランザクションの分離レベルが反復可能な読み取り以上に設定されているか、ロック ヒントを使用して共有 ( S) トランザクションの間ロックします。」
デフォルトの分離レベル (Read Committed) で、明示的なトランザクションのない行レベルのロックについて話していると仮定すると、「読み取り操作」とは何を指しますか?
- 単一行のデータの読み取り?
- 単一の 8k IO ページの読み取り ?
- または、ロックが作成された完全な Select ステートメントの実行が完了するまで、他にいくつの行が含まれていてもかまいませんか?
注: これを知る必要がある理由は、データ レイヤー Web サービスによって生成された数秒間の読み取り専用の select ステートメントがあり、ページ レベルの共有読み取りロックを作成し、行レベルの排他的更新ロックと競合するためにデッドロックを生成するためです。サーバーを最新の状態に保つ複製プロセスから。選択ステートメントはかなり大きく、多くの副選択があります。ある DBA は、「ロックが保持される時間を短縮するために」複数の小さなステートメント (より短い実行部分) に分割するように書き直すことを提案しています。これは、選択ステートメントが完了するまで共有読み取りロックが保持されることを前提としているため、それが間違っている場合 (行またはページが読み取られるときにロックが解放される場合)、そのアプローチはまったく効果がありません....