このような時間ベースの要求を処理する最良の方法は、直感的ではありません。
特定の時刻にテーブルを更新しないでください。代わりに、lease_expires_at
のようなタイムスタンプ列を含めます。
部屋を借りるときは、lease_expires_at
の値をレンタル期間の有効期限に設定するように行を更新します。たとえば、今から始めて30分部屋を借りたら、これを行います。
UPDATE room
SET lease_expires_at = NOW() + INTERVAL 30 MINUTE
WHERE room_number = whatever
あなたが部屋は、現在(NOW()
)であるかどうかを知りたい場合は取られ、これを行う:あなたが部屋は(NOW() + INTERVAL 60 MINUTE
)今から一時間利用できるようになりますかどうかを知りたい場合は
SELECT room_number,
CASE WHEN lease_expires_at IS NULL THEN 0
WHEN lease_expires_at <= NOW() THEN 0
ELSE 1 END taken
FROM room
WHERE room = whatever
を
SELECT room_number,
CASE WHEN lease_expires_at IS NULL THEN 0
WHEN lease_expires_at <= NOW() + INTERVAL 60 MINUTE THEN 0
ELSE 1 END taken
FROM room
WHERE room = whatever
その後、たまにはなく、任意のタイムクリティカルな方法で、あなたはこの
のようなクエリを使用して物事をクリーンアップすることができます、これを行います
UPDATE room SET lease_expires = NULL WHERE lease_expires <= NOW()
このクリーンアップを行うには、イベント、または夜間のcronjobなどを使用できます。アプリケーションの整合性は、このジョブがいつ実行されるかに依存しません。
taken
の値を設定するために定期的に実行されているプロセスに依存していて、そのプロセスが実行されない、または遅く実行されると、結果が正しくありません。時間に頼ると、正確な結果が得られます。
このデザインには小さな境界条件の詳細があります。私の質問に<=
を使用することによって、私はlease_expires_at
タイムスタンプを、現在のリースの最後の瞬間ではなく、別のリースで利用できる最初の瞬間を表すように選択します。それは便利な選択です。2017-11-2017 11:00:00
のようなものをlease_expires_at
に入れれば、誰かが「11時に部屋を利用できるのですか?あなたは簡単に「はい」と言うことができるようにしたいと考えています。"10:30にレンタルした人は、11:00前の瞬間までそれを取得します。