■質問日: |
2003/05/16 |
■最終更新日: |
2007/06/13 |
■質問内容: |
WDCはどのようにしてUPDATE時に排他制御を行っているのでしょうか? 内部的な動作を教えてください。 |
■回答内容: |
WDCではsetRowIdColumnNames()で指定したカラム名リストを元に更新行を特定します。 UPDATE時に1行だけ更新できれば正常終了、0行または2行以上更新したら排他エラーとしています。 例) AさんがTBL_Xの以下の行を取得します。 (TBL_Xの主キーはCOL_KEYとします。) カラム名:KEY, DATA, UPDATE_ID, UPDATE_TIME 値 :key, data, user_c, 2003/05/15 17:00:00 このとき発行されるSELECT文は次の通りです。 (SQL文はイメージ的なもので正確ではありません。ご了承ください。) SELECT KEY, DATA, UPDATE_ID, UPDATE_TIME FROM TBL_X WHERE KEY=key その後、AさんがDATAをaaaaに変更して、更新を行います。 このときに発行されるUPDATET文は次の通りです。 UPDATE TBL_X SET data=aaaa, UPDATE_ID=user_a, UPTATE_TIME=現在の時刻 WHERE KEY=key AND UPDATE_ID=user_c AND UPDATE_TIME = 2003/05/15 17:00:00 (WHERE句にはsetRowIdColumnsで指定したカラムが利用されます。 WHERE句の値には、SELECT時に取得したKEY,UPDATE_ID, UPDATE_TIME が入ります。) ここで、Aさん以外に誰もこの行を変更していなければ、 上記のUPDATE文により1行だけが更新されるはずです。 しかし、Aさん以外の誰かが同一行を更新していた場合 (例えばBさんが2003/05/16 11:22:33に更新していた場合 カラム名:KEY, DATA, UPDATE_ID, UPDATE_TIME 値 :key, bbbb, user_b, 2003/05/16 11:22:33) UPDATE文のWHERE句にマッチする行が存在しないため0行更新 となります。 したがって、WDCでは更新行が1行以外の場合に他のユーザにより 更新または削除が行われた、と判断しています。 もし、UPDATE文のWHERE句にテーブルの主キーしか含めなかった場合、 他のユーザから更新されたかどうか判断できません。 したがって、setRowIdColumnNames()では、 テーブルの主キー + 更新者ID + 更新日時 を設定することを推奨しています。 関連質問:No.60 |
■添付資料: |
なし |