Ich habe eine MySQL-Datenbank (InnoDB), die ich zur Verfolgung von Arbeitsaufträgen in meiner Organisation entwickle. Es gibt mehrere "Standorte", und jeder Standort verfügt über Arbeitsauftragsnummern, die bei 100 beginnen.
WorkorderID SiteID SiteWorkorderNum
1 1 100
2 1 101
3 2 100
WorkorderID ist das Feld für die automatische Inkrementierung.
SiteID und SiteWorkorderNum werden beide als eindeutige Einschränkung festgelegt.
Immer wenn ein neuer Arbeitsauftrag für eine bestimmte Site eingefügt werden soll, prüft die Anwendung das Maximum (SiteWorkorderNum) für die Site-ID des angemeldeten Benutzers und gibt diesen Wert an die Einfügeanweisung zurück. Das Problem, das ich vermeiden möchte, besteht darin, dass zwei Benutzer derselben Site genau zur gleichen Zeit einen neuen Arbeitsauftrag eingeben.
Ich habe ein paar mögliche Lösungen, aber ich möchte sehen, ob es einen besseren Weg gibt, da jeder seine Nachteile hat, aber einer ist sicher besser als der andere, und natürlich bin ich offen für neue Ideen.
1) Sperren Sie die Tabelle, um sicherzustellen, dass keine anderen Benutzer einen SiteWorkorderNum-Wert abrufen, bis wir unsere Werte abgerufen und eingefügt haben (tun wir jedoch so, als hätten wir Tausende von Benutzern, die jede Minute versuchen, Arbeitsaufträge einzugeben. )
2) Sperren Sie die Tabelle nicht und rufen Sie die nächste verfügbare SiteWorkorderNum ab. Versuchen Sie, sie in die Datenbank einzufügen. Wenn ich einen eindeutigen Einschränkungsfehler erhalte, fangen Sie den Fehler ab und versuchen Sie es erneut, bis ich erfolgreich bin. (Dies könnte die Tabelle frei halten, aber wenn wir wieder so tun, als hätten wir Tausende von Benutzern am selben Standort, wären die mehreren Datenbankaufrufe ein wenig ineffizient?)
Bin ich zu paranoid darüber, wie eine dieser Lösungen die Leistung beeinflussen könnte? Natürlich habe ich nicht Tausende von Benutzern, aber ich möchte Best Practices in diesem Design anwenden, falls ich jemals an einem Projekt mit hohem Datenverkehr arbeite.