- - PR -
update文のデッドロックについて教えてください。
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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に詳しい方、お力になっていただければ、光栄です。 よろしくお願いいたします。 | ||||
|
投稿日時: 2007-01-17 22:16
とあるのですが、単純にこのストアドプロシージャを同時実行した、ということでしょうか。 雰囲気的には「このストアドを含む別々の更新ロジックを同時実行」したように 思えるのですが。 1テーブルに対して5〜600件の更新でロックがぶつかるというのは、 タイムアウト値が小さい場合を除き考えにくいので、違うところに原因がありそうな気がします。 | ||||
|
投稿日時: 2007-01-17 22:52
> ⇒この場合、キー項目指定ではないので、テーブル内を全件検索し、
> 対象データをUPDATEするのでしょうか??? キー項目指定かどうかではなく検索条件でINDEXの使用の有無が決定されます なお600件程度ならINDEXがあっても無くてもあまり変わりません なおINDEXの使用の有無とLOCK TIMEOUTは関係が無いと思います | ||||
|
投稿日時: 2007-01-18 09:49
七味唐辛子さん、ご返答ありがとうございました。
| ||||
|
投稿日時: 2007-01-18 09:55
Ahfさん
ご回答ありがとうございました。 >とあるのですが、単純にこのストアドプロシージャを同時実行した、ということでし>ょうか。 >雰囲気的には「このストアドを含む別々の更新ロジックを同時実行」したように >思えるのですが。 画面上から、このSPを含むロジックを同時実行しました。 なので、テーブルの更新順序の問題ではないかと思っていたのですが。 LOCK TIMEOUTの件ですが、 この処理を同時実行して、プロファイラにて監視したところ、 「LOCK TIMEOUT」後、「Dead Lock」となってしまいました。 | ||||
|
投稿日時: 2007-01-18 12:54
SQL Serverは詳しくないですが、
複数のクライアントからの更新の順序が異なる、ということはないでしょうか? クライアントAからの更新要求 ID=AAA ID=BBB の順に更新 クライアントBからの更新要求 ID=BBB ID=AAA の順に更新 みたいな感じ。 | ||||
|
投稿日時: 2007-01-18 13:54
yuzyさん
ご返答ありがとうございます。 >SQL Serverは詳しくないですが、 複数のクライアントからの更新の順序が異なる、ということはないでしょうか? クライアントAからの更新要求 ID=AAA ID=BBB の順に更新 クライアントBからの更新要求 ID=BBB ID=AAA の順に更新 複数クライアントで、同一IDを更新することはありません。 IDがクライアントごとに一意になる為、 同一行にはUPDATEをかけに行かないはずなのですが、 デッドロックが発生してしまいます。 | ||||
|
投稿日時: 2007-01-18 14:54
ひとつ確認なのですが、問題となっているストアドでは
このUPDATE文以外に、同じテーブルAに対してSQLを実行している 箇所とかはないんでしょうか? | ||||
