これは別の質問に似ていますが、完全に同じではありません。
私の目標は、映画予約システムを設計することです。ユーザーは、映画のスケジュールの 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 に挿入します。
要件からは、いくつかの制約が自然に発生します。
インターフェースとデータベースの間に不一致がある可能性があるため、ユーザー A が座席を予約しようとしたときに利用可能な座席が十分にない場合は、ユーザー A に通知する必要があります。(たとえば、別のユーザー B は、A の直前にすべての座席を購入できた可能性があります。)
スケジュールが「オーバーブッキング」 ( <= ) されず、同時に更新されないようにしながら、MovieSchedSignUp に行をアトミックに挿入する必要があります。
count_signup
max_size
count_signup
支払いは 15 分以内に行う必要があります。
私の考えは次のとおりです。
支払いがいつ行われたかを追跡するために、MovieSchedSignUp に追加の列を用意します。
トランザクションを使用しますが、十分な座席があるかどうかに関する情報を返すにはどうすればよいですか?
バックグラウンドでバッチ ジョブを実行して、MovieSchedSignUp の「期限切れ」の行を削除します。
これを行うための最も効率的な方法は何ですか? 他の考えはありますか?バッチジョブを使いたくないのですが、他に方法はありますか?