[PHP-users 12110] Re: ページをまたいで、 DB のデータをロックする方法について

BAC php-users@php.gr.jp
Mon, 09 Dec 2002 01:05:04 -0800


BACです。

 設計時のポリシーになると思いますが、ページをまたぐ場合に複数のページに
渡ってのロックは危険なような気もします。

> (1)商品選択ページ
>  変更対象の商品を選択する
> (2)商品情報編集ページ
>  (1)で選択した商品の、現在の情報をテキストボックス等で
>  表示(SELECT文で)し、変更内容を入力させるページ。
> (3)確認ページ
>  (2)で入力した情報をDBに反映する前に、確認するページ
> (4)SQL発行ページ
>  実際にSQLを発行して(UPDATE文などで)、データを変更するページ

 この状態では以下のような状況が想定できます。

 まず、SELECT時にロックをかける場合ですが、

1. Aさんが商品情報編集ページを開く
2. そのまま退席
3. ミスの指摘を受けてBさんが急いで変更しようと開く
4. Bさんは書き込めない

があります。

 次に後の人優先の場合。

1. Aさんが入力を終えて確認ページまで行く
2. そこでAさんはトイレに
3. Bさんが商品情報編集ページを開く
4. Bさんはそこで昼食に
5. トイレから戻ってきたAさんはOKボタンを押す
6. Aさんは書き込めない

 つまり、データを書き込むまでまだ間があるのに排他処理をしてしまうところ
に問題があります。なので、まだデータが書き込まれていないのであれば書き込
ませてあげる、というのがよいのではないかと。

 具体的には

1. 各レコードに最終更新時刻を持たせる
2. 商品情報編集ページ(あるいは確認ページ)で最終更新時刻を取得
3. SQL発行ページで再度最終更新時刻を取得し、変化してなければ書き込み、そ
うでなければ書き込みできない、などの処理

 ポイントはロックをかけるならSQL発行ページだけで、というところです。

 この3のところで、例えば「この商品情報は変更されています。上書きします
か」とか出したり、確認のために現在の商品情報を別ウィンドウで表示するリン
クを出したりするとさらに便利でしょうね。

------------------------------------------
bac@dev-nul.com