0

これは別の質問に似ていますが、完全に同じではありません。

私の目標は、映画予約システムを設計することです。ユーザーは、映画のスケジュールの 1 つまたは複数の空席をクリックして予約できます。しかし、彼は 15 分が経過する前に支払いを行う必要があります。そうしないと、予約された座席は他のユーザーのために自動的に放棄されなければなりません。

次の疑似 MySQL があります。

テーブルムービー:

    id        int primary key,
    name      varchar,
    .....

テーブル MovieSched:

    movie_id       foreign key refers to Movie,
    sched_id       int primary key,
    showtime       datetime,         // date and time of schedule
    count_signup   int,              // number of sign ups
    max_size       int               // max number of seats

表 MovieSchedSignUp:

    sched_id  foreign key refers to MovieSched,
    user_id   foreign key refers to User,
    signup    datetime              // datetime of signup

すべての映画のスケジュールには、max_sizeサインアップできるユーザーがいます。ユーザーを登録するには、現在の日時を含む行を MovieSchedSignUp に挿入します。

要件からは、いくつかの制約が自然に発生します。

  1. インターフェースとデータベースの間に不一致がある可能性があるため、ユーザー A が座席を予約しようとしたときに利用可能な座席が十分にない場合は、ユーザー A に通知する必要があります。(たとえば、別のユーザー B は、A の直前にすべての座席を購入できた可能性があります。)

  2. スケジュールが「オーバーブッキング」 ( <= ) されず、同時に更新されないようにしながら、MovieSchedSignUp に行をアトミックに挿入する必要があります。count_signupmax_sizecount_signup

  3. 支払いは 15 分以内に行う必要があります。

私の考えは次のとおりです。

  1. 支払いがいつ行われたかを追跡するために、MovieSchedSignUp に追加の列を用意します。

  2. トランザクションを使用しますが、十分な座席があるかどうかに関する情報を返すにはどうすればよいですか?

  3. バックグラウンドでバッチ ジョブを実行して、MovieSchedSignUp の「期限切れ」の行を削除します。

これを行うための最も効率的な方法は何ですか? 他の考えはありますか?バッチジョブを使いたくないのですが、他に方法はありますか?

4

1 に答える 1

0

この状況では、トランザクションを使用する必要があると思います。

  1. 取引を開始する
  2. 追加するレコードを一時テーブルに挿入する
  3. 一時テーブル、MovieSched、および MovieSchedSignUp を結合して、レコード数 (temp と MovieSchedSignUp を合わせたもの) が最大サイズを超えていないことを確認します。
  4. OK の場合は、挿入を行います
  5. OK の場合はトランザクションをコミットし、そうでない場合はトランザクションをロールバックします。
于 2013-08-05T08:03:08.437 に答える