- PR -

update文のデッドロックについて教えてください。

投稿者投稿内容
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-17 15:01
はじめまして。
SQL SERVER初心者の為、ご指導の程お願いいたします。

UPDATE文で発生するデッドロックについて、
原因と解決方法を教えてください。

現在、ストアドプロシージャ内で、
以下のUPDATE文を使用しています。

UPDATE テーブルA
SET 更新済フラグ = '1'
WHERE ロック時間 = パラメータ.ロック時間
AND ロックユーザー = パラメータ.ロックユーザー
AND ID = パラメータ.ID

※Where句に使用する、ロック時間・ロックユーザー・IDは、
 キー項目では無く、インデックスも使用しておりません。
 ただし、対象データを一意に識別できる項目ではあります。
 
 ⇒この場合、キー項目指定ではないので、テーブル内を全件検索し、
  対象データをUPDATEするのでしょうか??? 

このストアドを含む処理を、ほぼ同時実行すると
このUPDATE文で「LOCK TIMEOUT」が発生し、
デッドロックとなってしまいます。


UPDATEの対象となるデータ件数は、ともに500〜600件です

また、対策としましてロックのヒント文を下記のように設定し、
WHERE句に設定している、ロック時間・ロックユーザー・IDに
対して、インデックスを作成してみましたが、
同様に、デッドロックが発生してしまいます。

UPDATE テーブルA with(rowlock)
SET 更新済フラグ = '1'
WHERE ロック時間 = パラメータ.ロック時間
AND ロックユーザー = パラメータ.ロックユーザー
AND ID = パラメータ.ID


SQL Serverに詳しい方、お力になっていただければ、光栄です。
よろしくお願いいたします。


Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-01-17 22:16
引用:
がちゃぴんさんの書き込み(2007-01-17 15:01)より:
このストアドを含む処理を、ほぼ同時実行すると
このUPDATE文で「LOCK TIMEOUT」が発生し、
デッドロックとなってしまいます。


とあるのですが、単純にこのストアドプロシージャを同時実行した、ということでしょうか。
雰囲気的には「このストアドを含む別々の更新ロジックを同時実行」したように
思えるのですが。

1テーブルに対して5〜600件の更新でロックがぶつかるというのは、
タイムアウト値が小さい場合を除き考えにくいので、違うところに原因がありそうな気がします。
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-01-17 22:52
> ⇒この場合、キー項目指定ではないので、テーブル内を全件検索し、
>  対象データをUPDATEするのでしょうか??? 

キー項目指定かどうかではなく検索条件でINDEXの使用の有無が決定されます
なお600件程度ならINDEXがあっても無くてもあまり変わりません

なおINDEXの使用の有無とLOCK TIMEOUTは関係が無いと思います
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-18 09:49
七味唐辛子さん、ご返答ありがとうございました。
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-18 09:55
Ahfさん
ご回答ありがとうございました。

>とあるのですが、単純にこのストアドプロシージャを同時実行した、ということでし>ょうか。
>雰囲気的には「このストアドを含む別々の更新ロジックを同時実行」したように
>思えるのですが。

画面上から、このSPを含むロジックを同時実行しました。
なので、テーブルの更新順序の問題ではないかと思っていたのですが。

LOCK TIMEOUTの件ですが、
この処理を同時実行して、プロファイラにて監視したところ、
「LOCK TIMEOUT」後、「Dead Lock」となってしまいました。




yuzy
大ベテラン
会議室デビュー日: 2002/02/14
投稿数: 117
投稿日時: 2007-01-18 12:54
SQL Serverは詳しくないですが、
複数のクライアントからの更新の順序が異なる、ということはないでしょうか?

クライアントAからの更新要求
 ID=AAA
 ID=BBB
の順に更新

クライアントBからの更新要求
 ID=BBB
 ID=AAA
の順に更新


みたいな感じ。
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-18 13:54
yuzyさん
ご返答ありがとうございます。

>SQL Serverは詳しくないですが、
 複数のクライアントからの更新の順序が異なる、ということはないでしょうか?

 クライアントAからの更新要求
  ID=AAA
  ID=BBB
 の順に更新

 クライアントBからの更新要求
  ID=BBB
  ID=AAA
 の順に更新


複数クライアントで、同一IDを更新することはありません。
IDがクライアントごとに一意になる為、
同一行にはUPDATEをかけに行かないはずなのですが、
デッドロックが発生してしまいます。


Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-01-18 14:54
ひとつ確認なのですが、問題となっているストアドでは
このUPDATE文以外に、同じテーブルAに対してSQLを実行している
箇所とかはないんでしょうか?

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