小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


CommandTimeoutとSQLServerのSET LOCK_TIMEOUTについて

ADODB.ConnectionオブジェクトのCommandTimeoutプロパティに指定するタイムアウト時間とSQLServerのSET LOCK_TIMEOUTで指定するタイムアウト時間を混同していたので、調べてみました。

CommandTimeoutプロパティ

CommandTimeoutには、ASPなどのスクリプトからコマンドを呼び出して、結果が返ってくるまでの待機時間を指定します。

コマンド実行が完了するまでの待機時間を秒単位で示す長整数型 (Long) の値を設定します。また、値の取得も可能です。既定値は 30 です。
CommandTimeout プロパティ はてなブックマーク - CommandTimeout プロパティ

CommandTimeoutプロパティの用途

ネットワークが輻輳状態だったり、サーバーが過負荷状態にあり、応答がなかなか返ってこない場合に、コマンドを指定時間経過後に取り消すことができます。

ネットワーク トラフィックやサーバーの過負荷により実行が遅れている Execute メソッドの呼び出しの取り消しを行えるようにするには、Connection オブジェクトまたは Command オブジェクトの CommandTimeout プロパティを使用します。コマンドの実行が完了する前に CommandTimeout プロパティで設定された時間が経過すると、エラーが発生してコマンドが取り消されます。
CommandTimeout プロパティ はてなブックマーク - CommandTimeout プロパティ

SET LOCK_TIMEOUT

SET LOCK_TIMEOUTは、SQLServerが特定の行やテーブルなどのロックを獲得しようとした場合に、獲得できるまで待機する時間を指定します。

Microsoft SQL Server がロック エラーを返すまでの経過時間をミリ秒単位で指定します。値が -1 (既定値) の場合は、タイムアウトは設定されず、無期限に待機することになります。
SET LOCK_TIMEOUT (Transact-SQL) はてなブックマーク - SET LOCK_TIMEOUT (Transact-SQL)

CommandTimeoutプロパティとSET LOCK_TIMEOUTの関係

上記のように、CommandTimeoutプロパティとSET LOCK_TIMEOUTは別物です。したがって、CommandTimeoutプロパティにタイムアウト時間を指定したとしても、必ずしもその待機時間分の待ちが発生するわけではありません。
たとえば、CommandTimeoutプロパティに10秒を指定した状態で、SET LOCK_TIMEOUTの指定が0ミリ秒(待ち時間なし)だった場合には、ロックが獲得できず、即座にエラーが返ってくることがあります。