オンラインホテル予約システム、同時予約?

私はオンライン決済でオンライン予約システムを作成するように求められています。同時に2人の顧客が同じ部屋を予約したときにどうするかと思います。

例:
同時に:

Customer1とCustomer2は1部屋しか利用できないスタンダードルームを予約しています。 (部屋の空室状況には、空き部屋がまだ1つあることが表示されます)。そして、彼らは同時に「確認」ボタンを押す。

4
画面の下部に、予約が確定するまで警告が表示されないようにしてから、少し遅いユーザーにエラーメッセージを送信します。正確に同じ時間に、他の要求が適切なエラーメッセージを生成しなければならない間に、1つまたは他の要求が最初に取得され、データベースを更新します。
追加された 著者 nnnnnn,
P.S.一時停止保留システムを導入して、最初に部屋を選択した後で確認する時間を10分にすることができます。これにより、空いていると言われる前にすべての詳細を入力しなくても同じ原理が適用されます誰かが最初にやって来ることを適用し、次の人は(やさしい)エラーメッセージを受け取るべきです。
追加された 著者 nnnnnn,
@Matti - 申し訳ありませんが、私はデータベースの更新が同時実行制御メカニズムであることを暗示するつもりです。基本的なデータベースでは、http要求が同時に処理されても2つのスレッドが同じレコードを同時に更新することはできません。
追加された 著者 nnnnnn,
@Matti - あなたが起動する前に、常に並行性を計画してください。ただし、レコードのタイムスタンプが以前に読み取られたときと同じである場合にのみ更新が適用される場合は、必ずしもレコードをロックする必要はありません。いずれの方法も有効です。
追加された 著者 nnnnnn,
なぜdownvotes?私はこれが有効な質問だと思う。
追加された 著者 Matti Virkkunen,
@nnnnnn:予期せぬことが起こり、(2つの別々のスレッドで)2つのリクエスト が同時に実行されるまで。このようなものは、ロックやトランザクションを実現する必要があります。
追加された 著者 Matti Virkkunen,
@nnnnnn:並行性を念頭に置いてコードを作成する必要があります。ロックがなければ、部屋がまだ空いているかどうかを最初に確認し、その後、両方のスレッドのチェックが更新前に実行される可能性があるため、ステータスを更新して確認を送信するプロセスが失敗します。
追加された 著者 Matti Virkkunen,
はい、リビジョンIDは並行処理を処理するための非常に有効な方法です。
追加された 著者 Matti Virkkunen,
@Sirs Mattiとnnnnnn:私はまだこれに新しいので、私はロックとスレッドを研究しています。ありがとう。
追加された 著者 KiiroSora09,

3 答え

一度に1つの確認だけが確実に行われるようにするには、ロック構成(この場合データベースレベル)を使用します。このような競合状態が発生する可能性がある場合は、常にこれを実行する必要があります。そうすれば、誰が最初の人かを常に知ることができ、他のユーザーに彼らの確認が遅すぎると伝えることができます。

あなたが追加したいかもしれない別のものは支払期限です。多くのシステムでは、何かを確認すると、予約を得るための支払いに一定の時間がかかります。その時間内に支払いをしないと、確認は失効し、再び部屋が利用可能になります。

4
追加された
@ KiiroSora09:それとも予約テーブルのフィールドを使用して予約を「保留中」としてマークすることもできます。そうすれば、同じ情報を持つ2つのテーブルを作成する必要がなくなります。
追加された 著者 Matti Virkkunen,
ありがとうございます...私は私のシステム上でそれらを実装しようとします、私は私の現在のWeb開発のスキルでそれらを行うことができることを願っています。私は多分、私は未払いの予約が記録されるテーブルを作ることができると思っていた...
追加された 著者 KiiroSora09,

これに対処するにはいくつかの方法があります。

  1. ユーザーが部屋を選択した場合、ウェブフロントエンドから利用可能な部屋を一時的に削除します。それ以降の訪問者は予約するためにその部屋を選択することができません。最初のユーザーがトランザクションを完了しなかった場合、その部屋は再び利用可能になります。
  2. 上記のようにデータベースにロックをかけるので、いつでも1つのレコードしか書き込めません。
0
追加された
私はかなり先生ではありませんが、丁寧さに感謝します;-)
追加された 著者 Martin Bean,
マーティン先生、お返事ありがとうございました。私はデータベースにロックをかける方法を見ていきます
追加された 著者 KiiroSora09,
私は私が持っているよりもはるかに多くの知識を持つ人々のために敬意を表したいと思う。特に彼らが助けようとしているとき。 *私はプログラマを賞賛する:D
追加された 著者 KiiroSora09,

予約を暫定的な、例えば10分とマークする「仮の」システムを使用してください。これらのスロットは、その後の要求では使用できなくなります。タイムフレーム内で予約が完了していない場合、スロットは再び解放されます。あなたがスロットを予約する前にすべての顧客の詳細をつかむ場合、ドロップアウト率は低く抑えるべきです。

あなたは時間枠を伝えなければならず、それは予約者に「暫定ステータス」です。あなたが訪問者がそれを止めることができた後の段階があれば、時間をカウントダウンする単純なJSタイマーが役立ち、プロセスに沿ってブックをプッシュすることもできます。

あるいは、最初に最初に来るときに最後の「支払い」ボタンが押されるまで、二重予約を許可します。 2番目の方法はより良い変換、最初の方法はより "正しい"です。

0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com

JavaScript - 日本のコミュニティ
JavaScript - 日本のコミュニティ
2 参加者の

日本人コミュニティのjavascript