ロックヒントを使用する

Oracleの「SELECT 〜 FOR UPDATE」みたいなことがSQL Serverで出来ないかなーと思い調べていたらあたったのでメモ。

環境

ロックヒント

SELECT * FROM [テーブル名] WITH (UPDLOCK) [WHERE 〜]

これでSELECT時に更新ロックを取得できる。他のセッションからロックを取得しようとすると待ち状態になる(普通のSELECTは出来るよ)。
待機しないで、すぐにエラーメッセージを返したい場合はOracleと同様に「NOWAIT」を追記する。

SELECT * FROM [テーブル名] WITH (UPDLOCK,NOWAIT) [WHERE 〜]

ロックの優先順位は、ロックヒント > トランザクション分離レベルなので、トランザクション分離レベルは変えたくないけれど、このSQLだけロックをかけたいなーというときに使おう。

引数

ロック種類
ロック種類 表記文字
ロックなし NOLOCK
更新ロック UPDLOCK
排他ロック XLOCK
ロック単位

ロック種類とあわせて使う。(TABLOCKX以外)

ロック単位 表記文字
テーブル単位 TABLOCK
テーブル単位で排他ロック TABLOCKX
ページ単位 PAGLOCK
行単位 ROWLOCK
相当するトランザクション分離レベル

ヒントの中には、トランザクション分離レベルと同等のロックモードを設定するものがある。
トランザクション分離レベルとヒントの組み合わせには色々なパターンがある(このレベルだとこのヒントは無効、とか)ので詳細は参考URLを参照のこと。

トランザクション分離レベル 表記文字
READUNCOMMITTED NOLOCK
READUNCOMMITTED READUNCOMMITTED
READCOMMITTED READCOMMITTED ※1
READCOMMITTED READCOMMITTEDLOCK
REPEATABLEREAD REPEATABLEREAD
SERIALIZABLE HOLDLOCK
SERIALIZABLE SERIALIZABLE

※1:非推奨。将来のSQL Serverでは実装されないかも。