[SQL Database] デッドロックの調査方法について

 

高原 伸城
SQL Engine Support Engineer

 

 

皆さんこんにちは。 SQL Server/Windows Azure SQL Database サポートを担当しております 高原 です。

今回は、Windows Azure SQL Database 上における、デッドロックの調査方法について紹介したいと思います。

Windows Azure SQL Database では、 スナップショット 分離レベル (READ COMMITTED SNAPSHOT) が有効になっています。

そのため、SELECT 文でデータの読み取り時に共有ロック (S) が要求されないため、デッドロックの発生が軽減されることが期待されます。

しかしながら、同じ行データに対して、複数のスレッドから同時に更新処理などが行われる状況がある場合、デッドロックは発生しうる現象となります。

SQL Server の場合は、トレース フラグ 1204 や 1222 を有効にすることにより、詳細な デッドロック発生時の情報を、SQL Server エラーログ上に出力することが可能でしたが、Windows Azure SQL Database では、トレース フラグを設定することが出来ません。

そのため、Windows Azure SQL Database では、デッドロック発生時にデッドロックの詳細情報を自動的に採取しています。

デッドロックの詳細内容の確認は、MASTER データベースに存在する “[sys].[event_log]” より確認が出来ます。

 

実際にデッドロックを発生させて、どのような情報が “[sys].[event_log]” より確認できるか、見てみましょう。

まずは、デッドロックを発生させます。 今回は 簡単なサイクルデッドロックを発生させてみました。

メッセージ 1205、レベル 13、状態 51、行 1
Transaction (Process ID 397) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

 

次に、MASTER データベースに接続し、以下のコマンドを実行します。

[コマンド例]

image

 

確認したいデッドロック情報の “additional_data” 列 を選択します。

 

image

 

オブジェクト “DB1.dbo.tab1“ の同じデータ (キー) に対して、process521543498 と process31c76d498 が互いに排他ロック (X) の獲得待ちとなり、サイクルデッドロックが発生していることが確認できました。

 

image

 

 

※ 注意: デッドロックの詳細情報は、即座に [sys].[event_log] には反映されません。 一般的に 1時間以内には反映されますが、最大 24 時間かかる場合があります。

 

[参考情報]

 

sys.event_log
< https://msdn.microsoft.com/ja-jp/library/windowsazure/jj819229.aspx>

 

※ 本Blogの内容は、 2013年4月 現在の内容となっております。