Ich arbeite an einem Abrechnungssystem (C# -Code, MySQL Galera Cluster-Backend, InnoDB-Speicher-Engine) und habe Zweifel, wie eine wirklich eindeutige Sequenznummer für Rechnungen generiert werden kann. Normalerweise habe ich in anderen Systemen einen einzigartigen Dienst erstellt, um die Rechnungsnummern zu erhalten. Wenn eine Rechnung generiert wurde, habe ich diesen Dienst nach einer Nummer gefragt, und dieser Dienst garantierte den exklusiven Zugriff auf eine Tabelle, die den Zähler dort hätte überhaupt kein Problem.Korrekte Isolationsstufe für sequentiellen Zähler
Aber dieses neue System ist für hohe Verfügbarkeit geclustert, so dass dieser Ansatz nicht akzeptabel ist, da mehrere dieser Dienste ausgeführt werden müssen.
So die Logik Ich bin hier aplying ist dies:
- Starttransaktion
- erstellen Rechnung ohne Seriennummer
- serielle Zähler abrufen
- schreiben neue Zähler Tabelle
- Update Rechnung
- commit
Wenn ich nicht falsch liege, wenn eine andere Transaktion den Zähler aktualisiert, bevor die aktuelle Transaktion beendet ist, wird die Festschreibung eine Ausnahme auslösen und ich kann die Operation wiederholen, die die Reihenfolge der Rechnungsnummern gewährleistet.
Also meine Frage ist, welche ist die richtige Isolationsstufe, um dies zu erreichen? ist READ_COMMITED genug oder kann es zu Duplikaten führen? Oder gibt es einen besseren Ansatz dafür?
Warum der Downvote? – Gusman
Meinst du NDB Cluster? Galera-Cluster? Oder ein anderer Geschmack? –
Es ist ein Galera-Cluster – Gusman