- PR -

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

投稿者投稿内容
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-18 16:25
Ahfさん。
ご返答ありがとうございます。

>このUPDATE文以外に、同じテーブルAに対してSQLを実行している
 箇所とかはないんでしょうか?

あります。

@ テーブルAへ処理対象行へ、ロック時間・ロックユーザー・IDを
  UPDATEします。(ロック情報の取得)

次に、更新処理が終わったら。

A テーブルAへ更新済みフラグを立てる為、
  UPDATEを行います。

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


B @で取得したロックを解放します。
  ロック時間・ロックユーザー・IDへNULLをセット
  
    UPDATE テーブルA
  SET ロック時間 = NULL
    ロックユーザー = NULL
    ID = NULL
  WHERE ロック時間 = パラメータ.ロック時間
  AND ロックユーザー = パラメータ.ロックユーザー
  AND ID = パラメータ.ID

わかりにくい説明で申しわけありませんが、
アドバイスお願いいたします。
  
  

shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-01-18 16:34
引用:

がちゃぴんさんの書き込み (2007-01-18 16:25) より:
@ テーブルAへ処理対象行へ、ロック時間・ロックユーザー・IDを
  UPDATEします。(ロック情報の取得)


という部分は
引用:

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


から考えると

  UPDATE テーブルA
  SET ロック時間 = パラメータ.ロック時間,
    ロックユーザー = パラメータ.ロックユーザー
  WHERE ID = パラメータ.ID
  AND (その他の条件)

のように「IDがWHEREに入っている」と思ってよろしいですか?「IDをUPDATE」ということなので、そうではないように思えるのですが・・
がちゃぴん
会議室デビュー日: 2007/01/17
投稿数: 11
投稿日時: 2007-01-18 17:06
shimixさん
ご返答ありがとうございます。

---------------------------------------------------------------------------
UPDATE テーブルA
  SET ロック時間 = パラメータ.ロック時間,
    ロックユーザー = パラメータ.ロックユーザー
  WHERE ID = パラメータ.ID
  AND (その他の条件)

のように「IDがWHEREに入っている」と思ってよろしいですか?「IDをUPDATE」ということなので、そうではないように思えるのですが・・
---------------------------------------------------------------------------
上記についてですが、

@の部分は、
処理対象データをロックするUPDATE文です。

UPDATE テーブルA
SET   ロック時間 = システム時間
     ロックユーザー = 処理しているユーザー
     ID       = 処理しているユーザーを一意に特定するID

WHERE  今回対象処理対象となるデータの抽出条件

となります。

わかりにくい、説明で申し訳ありません。



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