ロックヒントを使用する
Oracleの「SELECT 〜 FOR UPDATE」みたいなことがSQL Serverで出来ないかなーと思い調べていたらあたったのでメモ。
環境
- SQL Server 2005
ロックヒント
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では実装されないかも。