CGI-BBS > SO−HO > ショッピングバスケット > カゴ6で同時にカゴに商品を入れたらどうなりますか?


カレッヂ
カレッヂ


質問者 ayano  投稿日 12/15(土) 16:13:47
ショッピングバスケットのバージョン6を使わせて頂こうと思い、
中のコードを読んでいると、ブラウザにセットするクッキーには、
秒の値をセットしているようですが、同じ時間に二人以上の人が
買い物かごに商品を入れると、その人達のかごは同じ物になってしまうのでしょうか?
回答者 呑兵衛@大阪  [削除]  投稿日 12/16(日) 10:02:48
いいところに気づかれましたね。
答えは「共有される」です。
確かに、cookie 値と tmp ディレクトリに記述されるファイル名は 「年月日時分秒」です。
デフォルトでは、商品購入=書き込み操作で、排他制御(いわゆるロック)がされていないので、
ご指摘のような現象は起こり得ますし、簡単なロックでも起こり得ます。
結果、cookie は発行されますが、tmp ディレクトリに記述され、申し込みの最終確認時点で
再び参照される購入履歴は、空っぽになっているか、追加されているか、のどちらかが発生する
可能性があります。
sub input_to_cart にある
if ($COOKIE{'CART'} eq '') { $COOKIE{'CART'} = $date_num; } # かごが空の場合は新規割り当て

if ($COOKIE{'CART'} eq '') { $COOKIE{'CART'} = $$; } # かごが空の場合は新規割り当て
のようにして、スクリプトの実行プロセス番号 $$ を cookie とデータファイルの値(名前)
にすると、同時に商品購入があったとしても、perl の内部で順番が割り当てられるので、
同時書き込みの危険性は、「多少は」薄らぎます。ただ、完全ではありませんし、
完全な排他制御は、先達の最も悩むところのようです。

返信(回答)する


Web裏技