特定のテーブルで Insert や Updateがタイムアウトする
SQL Serverで特定のテーブルだけでInsertやUpdateがタイムアウトになり、レコードの追加や編集ができない場合の対処法について紹介します。
原因
原因はいくつか考えられますが、特定のテーブルで編集コマンド(Insert, Update)のSQLにタイムアウトになる場合は、テーブルがロックされている可能性が高いです。何らかのきっかけでテーブルがロックされたままになっている可能性があります。
補足
データベースやサーバーを再起動してもロックは保持されるため、サーバーの再起動では解決しません。
対処法
ロックの状態を確認する
データベースのロック状態を確認します。下記のSQLを実行します。
select DB_NAME(resource_database_id),resource_type, request_type,request_session_id
from sys.dm_tran_locks
解説
sys.dm_tran_locks
でロックされている要素の一覧を取得します。(
sys.dm_tran_locks
は現在アクティブなロック マネージャーのリソースを返します。)
resource_database_id
は対象となる、データベースIDですが、ID番号ではどのデータベースか判別しづらいため、DB_NAME関数の引数に与えデータベース名に変換します。
結果は以下の表示となります。
結果の一覧から、編集のできないデータベース名の要素を探し "request_session_id" の番号を控えます。
プロセスの終了
kill コマンドを使用してプロセスを終了します。
書式
例
先の例で、14行目のロックされている要素のプロセスを削除する場合は
kill 61
のSQLを実行します。
動作確認
プロセスを終了後、テーブルが書きこみ可能になっているか確認します。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。