バージョン選択

フォーラム

メニュー

オンライン状況

59 人のユーザが現在オンラインです。 (45 人のユーザが フォーラム を参照しています。)
登録ユーザ: 1
ゲスト: 58
aaefy44110 もっと...

サイト内検索

バグ報告 > フロント機能 > 同一商品を同じタイミングで購入した場合の在庫チェックについて

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
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) では、既に改修済みです。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

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をかけて、アンロックするのが良いと思います。


----------------
EC-CUBE公式エヴァンジェリスト
EC-CUBEインテグレートパートナー (株)スピリット・オブ
移転・拡張・高速化・問題解決
各種カスタマイズ・支援依頼承ります。

[url=h

seasoft
投稿日時: 2009/10/5 21:28
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7367
Re: 同一商品を同じタイミングで購入した場合の在庫チェックについて
> EC-CUBEの正式版、最新コミュニティ版ともに正確な排他制御処理は入っていませんよね?
> 私の認識では、理論上は上記が発生する事はあると思っています。
> (※間違っていたらすいません。)

UPDATE 一発で数値更新した場合、SELECT → UPDATE の場合と異なり、1要求については排他制御が行なわれるハズです。(PostgreSQL での検証は行なったことがありませんが、一般論として。)

つきましては、在庫が-1になる確率はありますが、5になることは無いかと思います。

(いや、排他制御もあったかも。そういえば。マイナス時は、ロールバックが走っていたような。分離レベルは怪しい予感はしますが。)


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

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文のカスタマイズを通常しています。


----------------
EC-CUBE公式エヴァンジェリスト
EC-CUBEインテグレートパートナー (株)スピリット・オブ
移転・拡張・高速化・問題解決
各種カスタマイズ・支援依頼承ります。

[url=h

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」ならロールバックという動作の方が良いのかもしれませんね。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

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さんとかぶりました)

のようですね。


多分、事前チェックなしで、事後だけで良さそうですね。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,006名です
総投稿数は110,020件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1646
8
red
1570
9
mcontact
1296
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.