2016-07-21 23 views
1

Ich werde ein Buchungssystem erstellen. In diesem System gibt es eine Person mit begrenzter Kapazität, Leute in definierter Zeit zu treffen. Z.B. Person A kann sich sonntags zwischen 8:00 und 12:00 Uhr mit höchstens 8 Personen treffen.Verwalten der logischen Integritätsbedingung für die Verarbeitung von Parallelität in der mySQL-Datenbankeinfügung

In meiner Datenbank habe ich zwei Tabellen darüber: Timings die vordefinierte Zeitpläne anzeigen und Bookings, die Buchungen zeigt, die behoben. Diese Tabellen sind wie unten definiert:

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 ; 

Also, wenn ich ein neues Treffen buchen werde, sollte ich prüfen, ob Anzahl der Zeilen in Bookings Tabelle zu einem bestimmten Zeitpunkt bezogen ist kleiner als seine Fähigkeit, neue zu ermöglichen Buchung.

Dies ist eine notwendige Bedingung, aber es reicht nicht aus, wenn Gleichzeitigkeit auftritt. Ich meine, wenn ich überprüfe count of (timings where timingFK=XXX)< timing.capacity, für die letzte verfügbare Buchung, kann es passieren, dass zwei Personen zur gleichen Zeit buchen dürfen, denn wenn sie die Bedingung überprüfen, war die letzte Buchung noch verfügbar. Ich möchte wissen, wie ich Semaphore-ähnliche Dinge implementieren kann, um zu vermeiden, dass zwei Leute die letzte linke Position beim Einfügen einer neuen Buchung buchen.

Antwort

0

Für maximale Sicherheit verwenden Sie eine Transaktion + select for update.

Für Index zeichnet die Suche Begegnungen, SELECT ... FOR UPDATE Schlösser den Zeilen und alle dazugehörenden Indexeinträge, die gleiche, als wenn Sie diese Zeilen eine UPDATE-Anweisung ausgegeben. Andere Transaktionen werden blockiert von dem Aktualisieren dieser Zeilen, von dem Ausführen von SELECT ... LOCK IN SHARE MODE oder von dem Lesen der Daten in bestimmten Transaktionsisolationsstufen. Konsistente Lesevorgänge ignorieren alle Sperren, die für die Datensätze festgelegt wurden, die in der Ansicht Lese vorhanden sind. (Alte Versionen eines Datensatzes kann nicht gesperrt werden;. Sie rekonstruiert werden durch Protokolle auf einer im Speicher befindliche Kopie des Datensatz rückgängig machen die Anwendung)

So könnten Sie haben

START TRANSACTION; 
SELECT COUNT(*) FROM Bookings WHERE somecondition FOR UPDATE 
INSERT INTO timings ... 
UPDATE Bookings .... 
COMMIT;