質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • PHP

    20879questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

在庫数1の商品を複数ユーザーに同時購入される場合の処理

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 777

una10

score 1

現在運用しているサイト(webゲームです)で在庫数のある商品の取り扱いをしようと思っています。
今まで上限の無いもののみ販売していたので、今回が初めてなのですが、どのような処理になるのでしょうか?

なかなか検索しても良い物が出てこなかったので、ざっくりでも構いませんので教えていただきたいです。
データの持ち方は1在庫1レコードでは無く、出来れば1商品に対してカウント数で持ちたいという希望があります。
また、現在の処理はユーザーが購入~反映までひとつのトランザクション内で行っています。

恐れ入りますが、ご教授いただければと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/03/28 19:00

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • una10

    2016/03/28 19:39

    すみません、処理そのものを記載してほしいわけではなく、一般的なECサイトなどにおける同類の処理やこういった問題に詳しい方がいれば・・・と思い質問をさせていただきました。 何分、課金回りは慎重に行いたいので。。。 色々な意見をお聞きしたいと思っております。

    キャンセル

回答 2

+1

購入処理には確認画面は存在するでしょうか?
おそらくあると思うですが、そうすると「ロングトランザクション」という問題が生じてきます。

残り一個の品を二人の人が購入しようとして確認画面を表示しているという状況がありえますね。その時点ではどちらの購入もまだ確定していないので。
そこでOKボタンを押すと、押すのが遅かった方の人が「やっぱり買えませんでした」というエラーを受け取ることになります。
確認画面が出たのに買えなかった、という事態をどう避けるかという問題がロングトランザクションです。
方法としては、確認画面を表示するときに仮購入とでも呼ぶべき処理をしてしまって在庫を一つ確保するというやり方があります。キャンセルしたなら在庫は戻ります。
問題は、キャンセルされないままブラウザを閉じられてしまった場合です。商品は仮購入状態のまま浮いてしまうのか? それはまずいので、仮購入から購入確定のタイムアウトを設ける必要があります。
PHPには苦手なソフトウェア要件になってきましたね…

簡単には「確認画面まで行っても購入確定時に在庫切れになる可能性がある」のを仕様にしてしまうことですね。それならこういう苦労はありません。確定時に購入トランザクションを動かすだけです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/28 19:49

    回答ありがとうございます。
    そうです。確認画面はあります。
    やはり確認画面の段階で仮の在庫数を減らす処理を入れるのがベストでしょうか。

    キャンセル

  • 2016/03/29 06:38

    何がベストかは商品の性質によって決まります。
    例えば航空券が「帰りのチケットだけは買えませんでした」となって往きのチケットだけ確定してしまったらお客様ブチ切れも確定ですよね。
    そういう商品だと仮購入状態で確保する必要が出てくるわけです。

    キャンセル

+1

例えばですが…

  1. 購入待ちテーブルを作る
  2. 購入ボタン押下時、購入待ちテーブルの商品IDカウントと商品テーブルの在庫数カウントを比較
  3. 在庫数が0を下回らなければ購入待ちテーブルに商品IDとユーザIDを登録して購入処理
  4. 購入完了で購入待ちテーブルから削除、在庫数-1
  5. ユーザキャンセル、一定時間経過などで購入待ちテーブルから削除

こんな感じでいかがでしょう。
「カートに入れたけど長時間決済しなかったからキャンセル扱い」というのも容易にできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/28 19:48

    回答ありがとうございます。
    なるほど。確認画面の前にさらにワンクッション入れるようなイメージでしょうか。
    そこまでラス1を争うような商品でも無いので、これでも良いかもしれません。

    キャンセル

  • 2016/03/28 19:57

    ポイントは「購入完了後に初めて在庫数を動かす」のではなく、「先に在庫数を動かしてから状態に応じて辻褄を合わせる」というところですね。
    ラス1の奪い合いでも、これならスムーズだと思いますよ。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20879questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。