2017年3月16日木曜日

【SQLServer】 selectが固まった(ロック残り)場合の対応方法

ある時ManagementStudioでselect文を実行したが、結果が返ってこないという事象が発生した。
恐らくデッドロックだろうと思い、調査を実施した。その際の覚え書き。

1. テーブル名からlock一覧とそのセッションの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)='テーブル名';

引用元
https://qiita.com/hexia/items/98c9b603e91c5eadb025
上記を実行するとsession idが表示される。

2. 利用状況モニター起動
Management Studioの上部のグラフのようなアイコンをクリック。

3. 該当セッションを強制終了
上記で取得したsession idの行が該当セッションとなる。ipアドレスやアプリの情報が表示されているため、そのアプリを終了するなどの対処を実施する。場合によってはセッション強制終了を行う。確か利用状況モニターの該当行を右クリックから強制終了出来たはず。

まぁDB再起動でもいいんだが、原因は知っといた方がいいので。

因みに今回はデッドロックではなく、手動でbegin transactionしてcommitが漏れてたというオペミスだった。
この場合は残っていたクエリウィンドウでcommitが正しい対処。

0 件のコメント:

コメントを投稿