ロック状況の確認

  • 全リスト
    SELECT
         resource_type AS type --オブジェクトの種類
        ,resource_associated_entity_id as entity_id  --エンティティID
        ,( CASE WHEN resource_type = 'OBJECT' THEN
              OBJECT_NAME( resource_associated_entity_id )
          ELSE
              ( SELECT
                  OBJECT_NAME( OBJECT_ID )
               FROM
                 sys.partitions
               WHERE
                   hobt_id=resource_associated_entity_id )
          END)
            AS object_name
        ,request_mode --ロックの種類
        ,request_type --要求の種類
        ,request_status  --状態
        ,request_session_id AS Session_id --セッションID
            ,(SELECT hostname 
              FROM sys.sysprocesses 
              WHERE spid = request_session_id) AS ProcessName
    FROM
        sys.dm_tran_locks
    WHERE
        resource_type <> 'DATABASE'
    ORDER BY
        request_session_id
  • 特定テーブル
    SELECT *
     FROM sys.dm_tran_locks
     WHERE resource_associated_entity_id
         =(SELECT TOP 1 object_id FROM sys.partitions WHERE OBJECT_NAME(object_id)='【テーブル名】');

インテントロック

ロックエスカレーション

  • システムのリソースが少なくなると行ロックからテーブルロックに自動的に変更する機能

ロックエスカレーション禁止

ロックエスカレーションを禁止する

ALTER TABLE テーブル名
SET ( LOCK_ESCALATION = DISABLE )

ロックエスカレーションの設定を元に戻す

ALTER TABLE テーブル名
SET ( LOCK_ESCALATION = TABLE )

ロックエスカレーションの設定を確認する

SELECT NAME ,LOCK_ESCALATION ,LOCK_ESCALATION_DESC FROM sys.tables

デッドロック

調査

  • 最初に、拡張イベントの「system_health」を見る
    • SQL Server Management Studioのオブジェクトエクスプローラーの「管理」→「拡張イベント」→「セッション」→「system_health」の下に、「package0.event_file」というものがあり、それをクリック
    • 画面右上のメニューから「フィルター」を選択し、以下の条件でフィルタをかける
      • フィールド : name
      • 演算子 : =
      • 値 : xml_deadlock_report
  • ファイル形式での拡張イベント「system_health」は、5MB:4世代しかデフォルトで残らないため、事後で確認可能とはいえデッドロック発生後は速やかに本ファイルを退避しておく方がよい

監視

NOLOCK


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-20 (木) 14:26:20 (139d)