バグ報告 > フロント機能 > 同一商品を同じタイミングで購入した場合の在庫チェックについて |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
yonyon2001 |
投稿日時: 2009/10/5 18:37
対応状況: −−−
|
新米 登録日: 2009/6/24 居住地: - 投稿: 6 |
同一商品を同じタイミングで購入した場合の在庫チェックについて こんにちは
現在、本番向けのテストをやっていますが、二つの端末からサイトに接続し同一商品を購入するテストしていますが、例えば、商品Aに在庫数を10個設定して購入制限を10個にします。 上記の二つ端末から商品Aを選択しそれぞれ5個と6個を入力して受注処理を進行していきます。最後の完了ページのボタンが偶然同時に押下された場合には排他制御が出来ない現象が起こり、在庫は5個が減っています。 タイミングが少しずれると正常にどちかエラーページが表示されますが、同時に押下された場合の回避または改善方法はありますでしょうか。 まだPHPには経験が少なくどこからみればいいかも知りません。 どうか教えて頂けないんでしょうか。 宜しくお願い致します。 ちなみにバージョンは2.4.1 MySql 5以上 PHP5以上です。 |
kishik |
投稿日時: 2009/10/5 19:16
対応状況: −−−
|
仙人 登録日: 2009/4/3 居住地: 東京 投稿: 382 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて 在庫は11個減らず、5個減った動作は正しいのではないでしょうか。。?(タイミングによっては6個減るのだと思いますが)
ここで言う排他制御というのは、ボタンを同時に押したら2つの注文の両方とも受け付けない、ということを意図していたのでしょうか。 ----- カスタマイズ承ります http://ec-cube-mall.jp/ http://ec-cube.ec-orange2.jp/ http://wiki.ec-orange2.jp/ |
yonyon2001 |
投稿日時: 2009/10/5 19:25
対応状況: −−−
|
新米 登録日: 2009/6/24 居住地: - 投稿: 6 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて ご返事ありがとうございます。
在庫が0になる場合はそれぞれDBのアクションがありましたって証拠ですが、二つの端末から同時に押下すると一方のみ反映され、 もう一つはDB処理なしにそのまま受注が正常に完了される風に見れます。 ちなみにタイミングが少しずらして二つの端末から押下すると残り在庫が5個なので6個の受注はエラー画面へ遷移するし、先に6個受注の処理が出来たら5個受注も在庫が4個なのでエラー画面へ遷移することは確認出来ました。 同時押下時の排他制御方法はありますでしょうか。 宜しくお願い致します。 |
seasoft |
投稿日時: 2009/10/5 20:42
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて もしかして、正式版をご利用なのでは?
EC-CUBEコミュニティ(eccube-comu) では、既に改修済みです。
|
AMUAMU |
投稿日時: 2009/10/5 21:25
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて EC-CUBEの正式版、最新コミュニティ版ともに正確な排他制御処理は入っていませんよね?
私の認識では、理論上は上記が発生する事はあると思っています。 (※間違っていたらすいません。) ですが、必要性と発生可能性、負荷とのバランスを考えると実装の必要があるのか疑問なので、利用する場合は限られると思いますがLC_Page_Shopping_Complete.phpのlfReduceStockをカスタマイズすることで排他制御は可能かと思います。 簡単な実装を考えると、在庫を減らすupdate文のwhere条件に、在庫数select時のstock数を一致条件に加え、updateされた数が0ならばrollbackをしてエラー処理に飛ばす方法があると思います。 マジメな実装をするならば、最終確認で在庫数をセレクトする段階で行ロックをSQLでかけ、updateをかけて、アンロックするのが良いと思います。
|
seasoft |
投稿日時: 2009/10/5 21:28
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて > EC-CUBEの正式版、最新コミュニティ版ともに正確な排他制御処理は入っていませんよね?
> 私の認識では、理論上は上記が発生する事はあると思っています。 > (※間違っていたらすいません。) UPDATE 一発で数値更新した場合、SELECT → UPDATE の場合と異なり、1要求については排他制御が行なわれるハズです。(PostgreSQL での検証は行なったことがありませんが、一般論として。) つきましては、在庫が-1になる確率はありますが、5になることは無いかと思います。 (いや、排他制御もあったかも。そういえば。マイナス時は、ロールバックが走っていたような。分離レベルは怪しい予感はしますが。)
|
AMUAMU |
投稿日時: 2009/10/5 21:55
対応状況: −−−
|
神 登録日: 2009/5/2 居住地: 東京都 投稿: 2712 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて たぶん、5になるパターンは正式版のほうかと思います。
コミュニティ版の場合は最新は-1になる確率があるかと思います。 5になる場合は・・・チェンジセット入っていたんですね。 http://svn.ec-cube.net/open_trac/changeset/18283 seasoftさんの上記修正以前はあったという感じですかね? UPDATE文1要求は原子的に処理される事はMySQLもPostgreSQLも保証されていますので、自分は在庫の正確性を要求するBtoB ECサイト等でUPDATE文のカスタマイズを通常しています。
|
seasoft |
投稿日時: 2009/10/5 22:05
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて > http://svn.ec-cube.net/open_trac/changeset/18283
> seasoftさんの上記修正以前はあったという感じですかね? yonyon2001 様の状況と同じ状況か確信は無いのですが、類似した在庫の異常は検出したことがありました。 同時注文による在庫マイナスも考慮するなら、SELECT による在庫チェックは UPDATE 後に「< 0」ならロールバックという動作の方が良いのかもしれませんね。
|
kishik |
投稿日時: 2009/10/5 22:05
対応状況: −−−
|
仙人 登録日: 2009/4/3 居住地: 東京 投稿: 382 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて ソースをチェックしていたので乗り遅れましたが、
結局在庫がマイナスになってもロールバックは無いような。。 (見落としていたらすみません) 処理の流れを読んだ限りでは、 UPDATE「後」のチェックがないのが問題っぽいですね。 これをチェックしてやれば、 少なくとも在庫が合計分減らずに注文が通るということは なくなりそうです。 (すみません。seasoftさんとかぶりました) ----- カスタマイズ承ります http://ec-cube-mall.jp/ http://ec-cube.ec-orange2.jp/ http://wiki.ec-orange2.jp/ |
seasoft |
投稿日時: 2009/10/5 22:06
対応状況: −−−
|
神 登録日: 2008/6/4 居住地: 投稿: 7367 |
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて > 結局在庫がマイナスになってもロールバックは無いような。。
されませんよ。現状では。 なので、 引用: 同時注文による在庫マイナスも考慮するなら、SELECT による在庫チェックは UPDATE 後に「< 0」ならロールバックという動作の方が良いのかもしれませんね。 > (すみません。seasoftさんとかぶりました) のようですね。 多分、事前チェックなしで、事後だけで良さそうですね。
|
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |