デッドロック情報を調べる print deadlock information
デッドロック情報を調べる print deadlock information
0.改訂履歴
- 2003.05.14 新規作成
- 2003.05.27 作成途中だったのでとりあえず完成させてみた.
1.はじめに
このドキュメントでは,Sybase SQL Serverにてデッドロック情報の取得について説明する.
2.デッドロックが発生した時の基本的な動作
- Sybase SQL Serverでは,デッドロックを検知したら,コストの高い(CPU時間の累積が多い)トランザクションを生かし,コストの低いトランザクションを犠牲(ロールバック)にする.
- デッドロックで犠牲になったトランザクションには,メッセージID1205のエラーが返却される.
- アプリケーションでは,トランザクションがデッドロックで異常を検知してしたら時間をおいてリトライするロジックとするのがセオリーである.
- また,「デッドロックは2つのテーブルのロックの掛け合いで起こる」事が教科書で紹介されているが,以下の点にも視野を広げて考えてみる.
- 実際には「インデックスの更新の取り合い」で発生することがある.
- また,見えない部分,たとえば「システムテーブル」が絡んでいたりする
3.デッドロックの詳細情報の収集
- デッドロックのより詳しい情報を仕入れるためには,次の設定パラメータをオン(1)にする.
デッドロック情報をロギングする設定とする
1> sp_configure "print deadlock information",1
2> go
Parameter Name Default Memory Used Config Value Run Value
------------------------------ ----------- ----------- ------------ -----------
print deadlock information 0 0 1 1
設定オプションが変更されました。オプションは動的なので、SQL Server を再起動する必要はありません。
(return status = 0)
1>
|
- ずっとオンにしっぱなしだと,エラーログファイルが大きくなるので,情報を採取したら止める.
デッドロック情報のロギングを停止する
1> sp_configure "print deadlock information",0
2> go
Parameter Name Default Memory Used Config Value Run Value
------------------------------ ----------- ----------- ------------ -----------
print deadlock information 0 0 0 0
設定オプションが変更されました。オプションは動的なので、SQL Server を再起動する必要はありません。
(return status = 0)
1>
|
- 実際に出力されたエラーログに内容は次の通り.(読みやすいように適当に改行を入れている)
01:2003/05/13 19:38:55.32 server Deadlock Id 96 detected.
Deadlock Id 96: Detected 1 deadlock chain(s) involved.
Deadlock Id 96: Process 13 (suid 22) was executing a INSERT command at line 1.
Deadlock Id 96: Process 10 (suid 22) was executing a SELECT command at line 1.
Deadlock Id 96: Process 10 was waiting for a 'shared page' lock on page 1627955 of the
'TBL_EMP' table in database 18 but process 13 already held a 'exclusive page' lock on it.
Deadlock Id 96: Process 13 was waiting for a 'exclusive page' lock on page 1718074 of the
'TBL_EMP' table in database 18 but process 10 already held a 'shared page' lock on it.
Deadlock Id 96: Process 13 was chosen as the victim. End of deadlock information.
01:2003/05/13 19:40:50.72 server Deadlock Id 97 detected.
Deadlock Id 97: Detected 1 deadlock chain(s) involved.
Deadlock Id 97: Process 17 (suid 22) was executing a UPDATE command at line 1.
Deadlock Id 97: Process 10 (suid 22) was executing a SELECT command at line 1.
Deadlock Id 97: Process 10 was waiting for a 'shared page' lock on page 1641955 of the
'TBL_EMP' table in database 18 but process 17 already held a 'exclusive page' lock on it.
Deadlock Id 97: Process 17 was waiting for a 'exclusive page' lock on page 1755389 of the
'TBL_EMP' table in database 18 but process 10 already held a 'shared page' lock on it.
Deadlock Id 97: Process 17 was chosen as the victim. End of deadlock information.
|
ちなみに,"database 18"というのは,sp_helpdbでデータベースのIDを確認できる.
- 日付の前の01というのは,エンジン番号.max online engineで.
- "Deadlock Id 96"というのは,このSQL Serverが起動してから96番目のデッドロックということ.
- プロセス13番のINSERT処理と,プロセス10番のSELECT処理がデッドロックしている.
- プロセス10番は
- TBL_EMPを共有ロックしようとしている.
- 既に13番のプロセスによって排他ロックが行われている.
- プロセス13番は
- TBL_EMPを排他ロックを行おうとしている.
- 既にプロセス10番によって,共有ロックが行われている.