ロック タイムアウトのカスタマイズ

別のトランザクションが競合するロックをリソースで既に所有しているために Microsoft SQL Server データベース エンジンで同じリソースへのロックをトランザクションに許可できない場合、そのトランザクションはブロックされ、既存のロックが解放されるまで待機状態になります。既定では、強制タイムアウト時間は設定されないので、ロック前にリソースがロックされているかどうかを調べる方法はデータにアクセスする以外にありません。そして、データにアクセスすると無期限にブロックされる可能性があります。

注意

SQL Server では、sys.dm_os_waiting_tasks 動的管理ビューを使用して、特定のプロセスがブロックされているかどうか、またどのプロセスがブロックしているかを判断できます。以前のバージョンの SQL Server では、sp_who システム ストアド プロシージャを使用していました。

LOCK_TIMEOUT 設定により、ブロックされたリソースをステートメントが待機する最大時間をアプリケーションから設定できます。待機時間が LOCK_TIMEOUT の設定を超えると、ブロックされているステートメントが自動的に取り消され、エラー メッセージ 1222 (Lock request time-out period exceeded) がアプリケーションに返されます。ただし、このステートメントが含まれているトランザクションは、SQL Server によってロールバックされたり取り消されたりしません。したがって、アプリケーションはエラー メッセージ 1222 をトラップできるエラー ハンドラを備えている必要があります。アプリケーションでこのエラーをトラップしないと、トランザクション内の各ステートメントが取り消されたことが認識されません。トランザクション内のこれ以降のステートメントが、実行されなかったステートメントに依存している可能性があるので、エラーが発生することがあります。

エラー メッセージ 1222 をトラップするエラー ハンドラを実装すると、アプリケーションでタイムアウトの状況を処理し、トランザクション全体をブロックまたはロールバックしたステートメントを自動的に再実行するなどの救済措置を講じることができます。

現在の LOCK_TIMEOUT 設定を調べるには、次に示す @@LOCK_TIMEOUT 関数を実行します。

SELECT @@lock_timeout;
GO