SQL Serverは、テーブルの選択中にロックを取得する順序をどのように決定しますか?


10

システムに負荷がかかっているときにデッドロックする2つのストアドプロシージャがあります。プロシージャBが同じテーブルに挿入している間に、プロシージャAはテーブルから選択しています。ロックグラフは、Proc AがProc BがIXモードロックを必要とするSモードページロックを持っていることを示していますが、Proc Aは、Proc BがすでにIXモードページロックを持っている別のページのSモードページロックを待機しています。

明らかに、両方のクエリがテーブル内のページを同じ順序でロックすることを確実にすることによってこれを整理することができますが、その方法を理解できません。

私の質問は、SQL ServerはどのようにINSERTとSELECTを実行しているときにページをロックする順序を決定し、この動作をどのように変更できるかを教えてください。

回答:


2

SQL Serverは、INSERTとSELECTの実行中にページをロックする順序をどのように決定しますか。

未定-内部処理によって実行され、クエリオプティマイザーの出力に依存します。

そして、どうすればこの動作を変更できますか?

あなたの分離を制御します。書き込むために読み取る場合は、すぐに書き込みロックを取得するようにSQL Serverに指示します。ポイントが閉じています。


1

現在、プロシージャAには共有ロックがあります。

「リソースに共有(S)ロックが存在する間、他のトランザクションはデータを変更できません。」http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

SQL 2005以降を使用している場合は、スナップショット分離を使用してみてください。

「スナップショット分離レベルでは、行のバージョン管理を使用してトランザクションレベルの読み取りの一貫性を提供します。読み取り操作はページまたは行のロックを取得しません。SCH-Sテーブルロックのみが取得されます。別のトランザクションによって変更された行を読み取るとき、行のバージョンを取得しますトランザクションの開始時に存在しました。データベースに対してスナップショット分離を使用できるのは、ALLOW_SNAPSHOT_ISOLATIONデータベースオプションがオンに設定されている場合のみです。このオプションは、ユーザーデータベースに対してデフォルトでオフに設定されています。http://msdn.microsoft.com/en-us/library/ms189122.aspx

Sch-Sロックのみが取得されるため、読み取りは書き込みをブロックできません。

「スキーマ安定性(Sch-S)ロックは、排他(X)ロックを含むトランザクションロックをブロックしません。」http://msdn.microsoft.com/en-us/library/ms189122.aspx

スナップショット分離レベルでは、行のバージョン管理にtempdbを頻繁に使用するため、サイズを適切に設定し、tempdbディスク戦略のベストプラクティスに固執してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.