- PR -

デッドロックについて

1
投稿者投稿内容
mm
会議室デビュー日: 2004/09/25
投稿数: 17
投稿日時: 2005-09-07 22:52
表題の件で質問があります。

あるシステムでDBのデッドロックが発生し、
その状況についてログを取りました。

(a)
http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2005/06.aspx
今回発生したデッドロックのログ情報は上記サイトにある内容とほぼ同じです。
ここでは「サイクルデッドロック」となっています。

(b)
実際にデッドロックが起こったSQLは下記URL中の"未記入"さんが
書かれている内容と同じです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21913&forum=26
同一クエリを複数セッションで実行すると「変換デッドロック」が発生すると
書かれています。

ここで質問なのですが、ログを見たときに「変換デッドロック」なのか、
「サイクルデッドロック」なのかはどのように判断するのでしょうか?
(ログの状況は(a)とほぼ同じで、SQLの内容は(b)とほぼ同じです)

初歩的な質問だと思いますが、ご教授お願い致します。

==================================
テスト環境:
Windows2000 Pro
SQL Server2000
.NET2003 VB
ADO.NET
ASP.NET
トランザクション分離レベル:Read Commited
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-09-07 23:27
引用:

マミさんの書き込み (2005-09-07 22:52) より:

ここで質問なのですが、ログを見たときに「変換デッドロック」なのか、
「サイクルデッドロック」なのかはどのように判断するのでしょうか?




お疲れ様です。
「サイクルデッドロック」と「変換デッドロック」は

サイクルデッドロックは名前の通り,
テーブルAとテーブルBという2つの資源があり,

テーブルA→テーブルB
テーブルB→テーブルA

と,たすきがけになるように更新してしまうことによって発生します。
これは,

Aのロックを持っているセッションがBのロックを
Bのロックを持っているセッションがAのロックを
要求することによるデッドロックです

「変換ロックは」
基本的にはトランザクション分離レベルが厳密な場合のトランザクション内で
テーブルAの共有ロック(読み取り)を持っている状態で更新用の排他ロックを取得しようとして発生するデッドロックです

つまり
A:共有ロック → 更新ロック
B:共有ロック → 更新ロック

よって,そもそもデッドロックを発生させているSQLセッションがわかれば見分けはつくと思います。

あえてログのみから判断するとすれば,
ロックされている資源を解析すれば判断できますね。

-----
TimberLandChapel
http://blogs.timberlandchapel.com/

[ メッセージ編集済み 編集者: TLC 編集日時 2005-09-07 23:31 ]
1

スキルアップ/キャリアアップ(JOB@IT)