2016-07-21 10 views
1

予約システムを作成します。このシステムには、定義された期間内に人を満たす能力が限られている人がいます。例えば。人Aは、日曜日の8時から12時の間に最大で8人の人と会うことができます。mySQLデータベース挿入の同時実行性を処理するための論理制約の管理

私のデータベースには、これに関する2つのテーブルがあります。Timingsは事前定義されたスケジュールを示し、Bookingsは固定された予約を示しています。 これらのテーブルは以下のように定義されています。私は、新しい会議を予約するつもりだときに指定したタイミングに関連Bookingsテーブルの行数は、新しい許可する能力よりも小さい場合ので、私は確認する必要があり

CREATE TABLE IF NOT EXISTS `Timings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `day` varchar(100) COLLATE utf8_persian_ci NOT NULL, 
    `start_time` int(11) NOT NULL, 
    `end_time` int(11) NOT NULL, 
    `capacity` int(11) NOT NULL, 
    `personFK` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_person_timing` (`personFK`), 
    KEY `id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=12 ; 



CREATE TABLE IF NOT EXISTS `Bookings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` varchar(100) COLLATE utf8_persian_ci NOT NULL, 
    `order` int(11) NOT NULL, 
    `booking_code` varchar(100) COLLATE utf8_persian_ci NOT NULL, 
    `timingFK` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_booking_timing` (`timingFK`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci AUTO_INCREMENT=1 ; 

予約。

これは必要条件ですが、同時実行が発生する場合は十分ではありません。 最後に利用可能な予約のためにcount of (timings where timingFK=XXX)< timing.capacityをチェックすると、最後の予約がまだ利用可能であったときに2人が同時に予約することができます。私は新しい予約の挿入中に2人が最後の左の位置を予約するのを避けるためにセマフォのようなものを実装する方法を知りたいですか?

答えて

0

安全性を最大限に高めるには、トランザクション+ select for updateを使用してください。インデックスについては

あなたはそれらの行のための UPDATE文を発行したかのように、検索遭遇を記録し、UPDATEロック 行と関連するすべてのインデックスエントリSELECT ... FOR、同じ。他のトランザクションは、特定のトランザクション分離レベルでデータを読み取ることから、 がブロックされ、SELECT ... LOCK IN SHARE MODEから、または からこれらの行が更新されません。 一貫読み取りは、読み取りビュー に存在するレコードで設定されたロックをすべて無視します。 (レコードの古いバージョンをロックすることはできません。。彼らは 、レコードのインメモリコピーのログを元に戻す適用することにより、再構築さ ある)

ですから、

START TRANSACTION; 
SELECT COUNT(*) FROM Bookings WHERE somecondition FOR UPDATE 
INSERT INTO timings ... 
UPDATE Bookings .... 
COMMIT; 
を持っているかもしれません
関連する問題