#author("2020-02-20T05:25:44+00:00","default:admin","admin")
#author("2020-02-20T05:26:20+00:00","default:admin","admin")
-[[SQL Serverのロックについて出来る限り分かりやすく解説:https://qiita.com/maaaaaaaa/items/38fd95b142b07acf7700]]

-[[DBMSのロック・分離戦略と同時実行制御:https://techinfoofmicrosofttech.osscons.jp/index.php?DBMS%E3%81%AE%E3%83%AD%E3%83%83%E3%82%AF%E3%83%BB%E5%88%86%E9%9B%A2%E6%88%A6%E7%95%A5%E3%81%A8%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E5%88%B6%E5%BE%A1]]
-[[SQL Server でのロック・タイムアウト:https://techinfoofmicrosofttech.osscons.jp/index.php?SQL%20Server%20%E3%81%A7%E3%81%AE%E3%83%AD%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88]]

-[[SQL Server トランザクションのロックおよび行のバージョン管理ガイド:https://msdn.microsoft.com/ja-jp/library/jj856598(v=sql.120).aspx]]
-[[【SQL server】ロックの種類とページ情報:http://memorandom-nishi.hatenablog.jp/entry/2016/11/03/210054]]

-[[SQLServerのテーブルロック状態を取得するSQL:https://www.excellence-blog.com/2016/11/11/sqlserver%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF%E7%8A%B6%E6%85%8B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8Bsql/]]

-[[SQLServerのテーブルロック状態を取得するSQL:https://lightgauge.net/database/sqlserver/3253/]]
-[[SQLServer: with(nolock)ヒントでロックを確実に回避できるという認識は間違い:https://qiita.com/maaaaaaaa/items/209a681f0a771cf80df4]]

-[[SQL Server の読み取り一貫性とロック:https://bellsoft.jp/blog/system/detail_586]]
-[[SQL Server のクエリヒントによるロックへの影響(SELECT):https://sqlazure.jp/r/sql-server/698/]]

*ロック状況の確認 [#a79ede94]
-[[SQLServerのテーブルロック状態を取得するSQL:https://www.excellence-blog.com/2016/11/11/sqlserver%E3%81%AE%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%83%AD%E3%83%83%E3%82%AF%E7%8A%B6%E6%85%8B%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8Bsql/]]
-[[特定のテーブルがロックされているか確認する。:https://qiita.com/hexia/items/98c9b603e91c5eadb025]]
-[[【SQL server】ロックの種類とページ情報:http://memorandom-nishi.hatenablog.jp/entry/2016/11/03/210054]]

-[[sys.dm_tran_locks (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-locks-transact-sql?view=sql-server-ver15]] ... ロック情報を参照できるビュー
-[[sys.partitions (Transact-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-catalog-views/sys-partitions-transact-sql?view=sql-server-ver15]] ... テーブルまたはインデックスで使用されているパーティション情報を参照できるビュー
-[[sys.sysprocesses (TRANSACT-SQL):https://docs.microsoft.com/ja-jp/sql/relational-databases/system-compatibility-views/sys-sysprocesses-transact-sql?view=sql-server-ver15]] ... 接続されているProcess情報を参照できるビュー

-全リスト
 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)='【テーブル名】');

*インテントロック [#r66e7160]
-[[Intent Lockというものが謎:https://kuenishi.hatenadiary.jp/entry/20080807/1218096546]]

*ロックエスカレーション [#rea4a19b]
-システムのリソースが少なくなると行ロックからテーブルロックに自動的に変更する機能

-[[SQL Server でロックのエスカレーションが原因で発生するブロッキング問題を解決する方法:https://support.microsoft.com/ja-jp/help/323630/how-to-resolve-blocking-problems-that-are-caused-by-lock-escalation-in]]
-[[ロックのエスカレーション (データベース エンジン):https://technet.microsoft.com/ja-jp/library/ms184286(v=sql.105).aspx]]

-[[SQL Server のロックのエスカレーション:https://techinfoofmicrosofttech.osscons.jp/index.php?SQL%20Server%20%E3%81%AE%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E3%82%A8%E3%82%B9%E3%82%AB%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3]]
-[[【SQL server】ロックエスカレーションの閾値について:http://memorandom-nishi.hatenablog.jp/entry/2016/11/04/010039]]
-[[SQLServerのロックエスカレーション:http://kens30.blog92.fc2.com/blog-entry-163.html]]
-[[【トレースフラグ 1224】──ロック数によるロックエスカレーションの発生を無効化する:http://www.atmarkit.co.jp/ait/articles/1804/23/news008.html]]

**ロックエスカレーション禁止 [#nc48437e]
-[[ロックエスカレーションを禁止する設定:https://www.projectgroup.info/tips/SQLServer/MSSQL_00000016.html]]
-[[【SQLServer】ロックのエスカレーション防止:http://i-found-a-four-leaf-clover.hatenablog.com/entry/2016/02/08/212539]]
-[[ロックエスカレーションを禁止する設定:https://www.projectgroup.info/tips/SQLServer/MSSQL_00000016.html]]

***ロックエスカレーションを禁止する [#u44d6d88]
 ALTER TABLE テーブル名
 SET ( LOCK_ESCALATION = DISABLE )

***ロックエスカレーションの設定を元に戻す [#xd63f74f]
 ALTER TABLE テーブル名
 SET ( LOCK_ESCALATION = TABLE )

***ロックエスカレーションの設定を確認する [#gd682e62]
 SELECT NAME ,LOCK_ESCALATION ,LOCK_ESCALATION_DESC FROM sys.tables

*デッドロック [#v694c22d]
-[[MSSQLSERVER_1205:https://docs.microsoft.com/ja-jp/sql/relational-databases/errors-events/mssqlserver-1205-database-engine-error?view=sql-server-2016]]

-[[デッドロックの考え方と調査方法指針をまとめてみた:http://dalmore.blog7.fc2.com/blog-entry-154.html?sp]]

-[[SQL Server でのデッドロック:https://techinfoofmicrosofttech.osscons.jp/index.php?SQL%20Server%20%E3%81%A7%E3%81%AE%E3%83%87%E3%83%83%E3%83%89%E3%83%AD%E3%83%83%E3%82%AF]]
-[[SQL Server 技術情報 - デッドロックの解決方法:https://support.microsoft.com/ja-jp/help/832524/sql-server-technical-bulletin-how-to-resolve-a-deadlock]]

-[[【SQL server】デッドロックの調査方法:http://memorandom-nishi.hatenablog.jp/entry/2016/11/14/024856]]
-[[【SQL server】インデックス間のデッドロック:https://memorandom-nishi.hatenablog.jp/entry/2017/07/02/155841]]

-[[Insert文一つでもデッドロックが発生する?:https://qiita.com/smitho/items/c81d58ec212a90478bfe]]

-[[デッドロック(SQL Server):https://www.dbsheetclient.jp/blog/?p=1609]]
-[[SQLSERVER デッドロック発生:http://blog.livedoor.jp/got2u/archives/2047953.html]]

-[[【SQL Server】1テーブル・1行の更新だけでもデッドロックが発生するという話:https://qiita.com/sashim1343/items/fe0b978fb8d6ea7e73a1]]

**調査 [#cbc63fcc]
-[[デットロックの調査方法:http://kiyo7447.blogspot.com/2015/08/blog-post.html]]
-[[【SQL server】デッドロックの調査方法:https://memorandom-nishi.hatenablog.jp/entry/2016/11/14/024856]]
-[[ブロッキングとデッドロックを後追い確認する方法:https://blog.engineer-memo.com/2012/08/30/%e3%83%96%e3%83%ad%e3%83%83%e3%82%ad%e3%83%b3%e3%82%b0%e3%81%a8%e3%83%87%e3%83%83%e3%83%89%e3%83%ad%e3%83%83%e3%82%af%e3%82%92%e5%be%8c%e8%bf%bd%e3%81%84%e7%a2%ba%e8%aa%8d%e3%81%99%e3%82%8b%e6%96%b9/]]
-[[今年最後のデッドロック調査:http://blog.livedoor.jp/kagamihoge/archives/50337098.html]]


-最初に、拡張イベントの「system_health」を見る
--SQL Server Management Studioのオブジェクトエクスプローラーの「管理」→「拡張イベント」→「セッション」→「system_health」の下に、「package0.event_file」というものがあり、それをクリック
--メニューで「フィルター」を選択
--画面右上のメニューから「フィルター」を選択し、以下の条件でフィルタをかける
---フィールド : name
---演算子	: =
---値 : xml_deadlock_report

--ファイル形式での拡張イベント「system_health」は、5MB:4世代しかデフォルトで残らないため、事後で確認可能とはいえデッドロック発生後は速やかに本ファイルを退避しておく方がよい

**監視 [#a6b9546b]
-[[【SQLServer】ブロッキングを監視する方法:https://qiita.com/yaju/items/fdb73d913142a83eb3aa]]
-[[SQL Serverのパフォーマンスに関わるトレースフラグ簡易まとめ:http://interprism.hatenablog.com/entry/sqlserver_traceflag]]

*NOLOCK [#xfbd6e45]
-[[SQLServer: with(nolock)ヒントでロックを確実に回避できるという認識は間違い:https://qiita.com/maaaaaaaa/items/209a681f0a771cf80df4]]
-[[SQLServerではNOLOCKを使用していても「ロック要求がタイムアウトしました。」のエラーになることがある:http://d.hatena.ne.jp/replication/20100606/1275837657]]
-[[SQL Server のクエリヒントによるロックへの影響(SELECT):https://sqlazure.jp/r/sql-server/698/]]
-[[[SQL Server]SQLServerのNOLOCKロックヒント(ダーティーリードがしたい):https://memo.itsysgroup.com/?p=476]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS