ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverのテーブルヒント「NOWAIT」について

今回は、SQL Serverのテーブルヒントの一つである「NOWAIT」を簡単に確認してみようと思います。

以前、SQL Serverのロックタイムアウトの設定について以下の記事で触れました。
SQL Serverのロックタイムアウトについて - ITエンジニアの成長ブログ


上記のようなロックタイムアウトの設定に関係なくロック待ちを一切せずに、エラーとするようなテーブルヒントが「NOWAIT」です。
テーブル ヒント (Transact-SQL) - SQL Server | Microsoft Learn


簡単に実機で挙動を確認してみます。まずは「NOWAIT」を付けない場合です。
あるセッションで以下のように、「BEGIN TRAN」を使用し、COMMITまたはROLLBACKせずにロックを保持しておきます。

あるテーブルのロックを保持しておく

そして別のセッションではまず以下のとおり、「lock_timeout」の値を3000(ミリ秒)に設定しておきます。

DBCC USEROPTIONS実行結果

そのあとに最初のセッションと同じレコードを更新しようとします。すると以下のようにロックタイムアウトでエラーが発生しました。

ロックタイムアウトエラー

エラーのタイミングは先ほど設定した3000(ミリ秒)後でした。このように、ロックタイムアウトの設定値まで待ってもロックが解放されない場合は、エラーが発生します。

それでは、テーブルヒント「NOWAIT」を付けてもう一度エラーになったクエリを実行してみます。エラーのメッセージや内容はまったく同じですが、今回は3000(ミリ秒)を待つことなく即座にロックタイムアウトが発生しました。

NOWAITで即座にエラー

構文としては、簡単でテーブル名の後に以下のような文を付与します。

WITH (NOWAIT)


また、今回のようなテーブルヒント「NOWAIT」を使わないでも、例えば以下のようにSETオプションを設定すれば同じような挙動になります。ロックタイムアウトが=0(ミリ秒)なので、一切待たないということですね。

SET LOCK_TIMEOUT 0

おわりに

いかがでしょうか。テーブルヒントは、普段は使うことがないかもしれませんが場合によっては必要になってしまうケースもあるかと思います。
今回のテーブルヒント「NOWAIT」は要件によって使えるかもしれませんので、覚えておいて損はないかと思います。

今回はここまで。最後までお読みいただきありがとうございました。