質問: トランザクションのコミットを発行するまでの間に、数回、クライアント画面上で処理を実行したい。その間、在庫を押さえたい 環境 PHP5.6 MySQL5.0.11 業務で使っている管理画面が、主に3つ ・工場 ・倉庫 ・営業 この中で、 工場は完成品の個数と倉庫への在庫情報入力、発送予定の入力などを実行 倉庫は、工場からの入荷と、顧客の元への発送記録を入力 営業は、顧客向けの配送指示を入力 この一連の流れの中で、営業が顧客から注文を受け、商品コードを入力して受注数も入力するのですが、注文数に応じてオプションをいくつか選ぶ必要があるのですが、商品コードを入れてから在庫数をいったん確認して、オプションの照会指示もかけなければならないため、1画面で必要な情報を全て引いてくることが難しく、数回に分けて画面に必要な情報を集めてきて、最後にDBに反映させる必要があります。しかも、個数によっては工場向けの指示と倉庫向けの指示が同時に行われるため、これも、1画面で処理を難しくさせるいったんでもあります。 そこで、営業が発注確定する間、同じ商品コードのモノについて排他ロックをかけざるを得ないのはokということで進めるのですが、いろいろ調べた限りでは、php の処理が完了するときに pdo も破棄されるため、画面をまたぐプーリングができなそうですが、実際に方法はないのでしょうか? 例えば、ホテルや飛行機の予約も同じだと思いますが、空室、空席をある一定時間の間、在庫情報から引き抜き、利用者情報を入力するまでの間、空きを保証するようなシステムは、自前で疑似トランザクションを仕立てているのでしょうか? (PHP + MySQL に限ってということです) よろしくお願い申し上げます。
回答: まず、どこの部署から出てきた要件なのか?というのが1つのポイントです。 1. システム部、工場、倉庫、営業、会計(監査)のどの部署から出てきたのでしょうか? そしてその件について他の部署へはどの程度まで強制できますか? 2. 現行システムにない現状のオペレーションを確認するのもいいかもです。 << 本題 >> 内容を見る限りでは仮引当・予約引当に当たります。 発注残の扱いによって在庫テーブルの持ち方が変わるので一般論でしかいえませんが、 仮引当数は(顧客からの)受注情報(伝票)テーブルと在庫テーブルの両方に持つような形で設計してください。 これは後で消込をするためです。消込タイミングはいろいろなタイミングがあるので、業務要件&システム要件について設計する必要があります。 << 注意事項 >> 在庫引当に関わることなので、確認が大変です。 業務経験年数が豊富な方にまず在庫の考えについて確認したほうが 特に在庫テーブルからの出力伝票及び売上/会計連動しているならその数値の扱い 出荷予定の扱いも気になりますが・・・ 具体的な話は出来ませんでしたので、参考まで。