SQLServerのテーブルロック状態を取得するSQL

公開日: : 最終更新日:2016/07/19 SQL Server , , ,

SQLServerのデッドロックを調査している中で
ロックの状態を調べるSQLがあることが
判明したのでメモします。

ロックの状態を取得するSQL

ロックの状態を取得するSQLは以下のようにすれば取得できるようです。
(参考ページ:ロックの状態を調べる

SQLの実行結果

上記のSQL実行結果は


ロックの種類

ロックの種類は以下のものになります。

S 共有ロック 他のトランザクションからの読込は可能。更新は不可となる。
X 排他ロック 他のトランザクションからの読込・更新が共に不可となる。
INSERT、UPDATE、DELETEを実行するとこのロックになる。
U 更新ロック 他のトランザクションからの読込は可能。更新は不可となる。
SELECTで WITH( UPDLOCK )を指定するとこのロックになる。
IS インテント共有 下位の階層に位置するリソースの (すべてではなく)
一部に対し、要求されているかかけられている共有ロックを保護します。
IX インテント排他 下位の階層に位置するリソースの (すべてではなく)
一部に対し、要求されているかかけられている排他ロックを保護します。
IX は IS のスーパーセットです。また、下位のリソースに対する共有ロックの要求を保護します。
SIX インテント排他の共有 下位の階層に位置するすべてのリソースに対し、
要求されているかかけられている共有ロックを保護し、下位のリソースの (すべてではなく)
一部のインテント排他ロックを保護します。
上位リソースで同時実行している IS ロックは可能です。
たとえば、テーブルに対し SIX ロックをかけると、
変更中のページにインテント排他ロックが、変更中の行に排他ロックがかかります。
1 つのリソースに対しては、一度に1つのSIXロックしかかけられません。
その結果、他のトランザクションによってリソースが更新されることはなくなりますが、
他のトランザクションはテーブルレベルのISロックをかけることで
下位のリソースを読み取ることができます。
IU インテント更新 下位の階層に位置するすべてのリソースに対し、要求されているかかけられている更新ロックを保護します。
IU ロックはページ リソースに対してのみ使用します。
更新操作が発生すると、IU ロックは IX ロックに変換されます。
SIU 共有インテント更新 SロックとIUロックを個別にかけるか、同時にかけるかして組み合わせたものです。
たとえば、トランザクションで PAGLOCK ヒントを指定してクエリを実行してから更新操作を実行するとします。
PAGLOCK ヒントを指定したクエリでSロックをかけ、更新操作で IU ロックをかけます。
UIX 更新インテント排他 UロックとIXロックを個別にかけるか、同時にかけるかして組み合わせたものです。
スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • 14 follow us in feedly

関連記事

no-img

SQLで前の行と同じ値は表示しないようにする

前の行と同じ値は表示しない SQLで前の行と同じ値は表示しないようにするして 伝票印刷のような処

記事を読む

no-img

ORDER BYでNULLのカラムを最後に表示

ORDER BYでNULLのカラムを最後に持ってくる SQLで何も考慮せずに「ORDER BY」す

記事を読む

keybord_black

SQLで存在しない行を生成し固定行数で処理したい時に役立つ方法

帳票データなどで登録されているデータ数に左右されず、 固定行数でデータを取得したい場合があります。

記事を読む

no-img

ALTER TABLE ADDでテーブルにカラムを追加する

SQL Serverでテーブルにカラムする SQL Serverでテーブルにカラムを追加します。

記事を読む

no-img

データベースに登録されている内容を固定長のファイルに出力する(1)

登録されている内容を固定長で出力 データベースに登録されている内容を固定長のファイルに 出力する

記事を読む

no-img

SQLServerで作ったテンポラリテーブルが見つからず無効になってしまう

SQLServerでテンポラリテーブルを利用して処理を行う時に 「オブジェクト名 '#tmp_ta

記事を読む

no-img

SQLでCASE~WHENを使ってみる

SQLでCASE~WHENを使う SQLでCASE~WHENを使うとIF文で分岐して実行文を分ける

記事を読む

no-img

ISNULL()関数を使ってSQLでIF文を使わずに条件を分岐する

ISNULLをIF文の代わりに使ってみる SQLでIFを書けばWHERE句の内容を変えて検索できま

記事を読む

a0001_013635

SQLで文字列を反転させる

SQLで文字列を反転させる SQLで文字列を"012345"を後ろから並び変えて"543210"の

記事を読む

no-img

0で埋めで固定長のデータにする

0で埋めで固定長のデータにする データべース内のデータを0埋めして取得します。 RIGHT(

記事を読む

SQLServer
SQLServerで「WITH ROLLUP」を使って小計、総合計を出力する

「WITH ROLLUP」を使って小計、総合計を出力 SQLServ

no-img
MERGEでINSERTとUPDATEを1行で実行する

MERGE文を使うと行の存在有無を気にせずに1行のSQLでOK

no-img
CASE WHENを使ってSQLでIF文を使わずに条件を分岐する

SQLでIFを使わずに条件分岐する SQLでIFを書けばWHERE句

no-img
SQLServerではTRIM関数がありません

SQLServerでは空白を取り除くTRIM関数がない SQLSer

no-img
TOP句で変数を使ってSQLを1行にする

TOP句で変数を使ってSQLを1行にする TOP句を使って複雑なSQ

→もっと見る



PAGE TOP ↑