ロックエスカレーションによって1つのトランザクションだけでデッドロックはあり得るか?
SQLServer 2017 Standard とします。
以下のようなトランザクションがあります。
(注)記述の通り、レコードR1/R2はともにページPに配置されている。
- テーブルTのレコードR1に更新をかける
1-2. レコードR1に対してXロック要求、獲得
1-3. レコードR1を含むページPにIXロック要求、獲得 - テーブルTのレコードR2をSELECT
2-1. レコードR2に対してSロック要求・・・
2-2. しかしここでロックエスカレーションが発生
2-3. エスカレーションにより、レコードR2を含むページPにSロックを要求
2-4. ページPは既にIXロックがかかっているので、Sロックが獲得できない?
この後、IXロック解放待ちで止まってデッドロックってことになっちゃいますが、1つのトランザクションでデッドロックって、変ですよね。
多分起きないだろうと思っていますが、それを解決するメカニズムが分からず。
SQLServerの「SIXロック」が何なのか、説明を見てもよく分からなかったのですが、もしかしてこのときにSIXロックになるのでしょうか?