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.
quelle
Antworten:
Was an dieser Situation interessant ist, kann mit dem MyISAM-Speicher gelöst werden.
Ich habe bereits im April 2012 eine Frage wie diese beantwortet: Wie können Sie zwei automatisch inkrementelle Spalten in einer Tabelle haben? Sie müssen eine Tabelle erstellen, deren einziger Zweck darin besteht, Arbeitsauftragssequenzen für jeden Standort zu erstellen
Hier ist ein Beispiel, das in diese Tabelle geladen wird:
Schauen wir uns die letzte WorkorderNum von jeder Site an
Angenommen, Sie möchten die nächste SiteWorkorderNum für SiteID 3 erhalten. Sie können dies tun:
Lassen Sie uns dies ausführen und sehen, was passiert
Solange Sie dieses eine MyISAM neben allen InnoDB-Tabellen verwenden, können Sie nach Herzenslust Workordernums pro Site generieren.
quelle