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.