2017-03-06 4 views
0

Ich habe eine Datenbanktabelle in Postgres, die verwendet wird, um Quittungsnummern für das Unternehmen zu generieren. Die Tabelle hat eine Spalte mit dem Namen receipt_number, die eingefügt wird, wenn eine Zeile nach dem Post aufgezeichnet wird Überprüfen Sie die letzte Quittungsnummer und erhöhen Sie sie um 1, um die nächste Quittungsnummer zu erhalten. Das Problem ist, dass wenn zwei Kunden gleichzeitig zahlen, zwei Zeilen aufgezeichnet werden, aber sie haben die gleiche Quittungsnummer, sonst ist alles in Ordnung .Wie doppelte Eintrag in Postgres-Datenbank-Tabelle zu steuern

Jede Idee von dem, was die Ursache dafür ist ... Wie es geschieht nur, wenn mehrere Clients Zahlungen zur gleichen Zeit machen ..

Vielen Dank im Voraus

+0

Sie haben keinen Primärschlüssel in der Tabelle –

+0

Wie überprüfen Sie die "letzte Belegnummer"? Wenn das ein einfaches 'max()' ist, dann wird es nie funktionieren. Kannst du mit Lücken in der Anzahl leben? Dann benutze eine Sequenz. –

+0

Ich habe das PK, das ich vorher benutzt habe, aber plötzlich fing es an, Zahlen nicht in einer seriellen Reihenfolge zu springen und so entschied ich mich, eine separate Spalte einzuführen.Und du hast Recht, ich benutzte Max() und es gab mir das gleiche Problem. Ich habe eine separate Tabelle, die ich Current_receipt_number von denen vor dem Einfügen eines neuen Datensatzes in der Quittung Tabelle ich es erhöhen und dann auf die aktuelle Zahl für den nächsten Eintrag bereit – user6781731

Antwort

0

Es ist die gleichzeitigen Zugriff durch. Wenn das Ereignis zweimal gleichzeitig auftritt, erhalten beide Instanzen den maximalen Wert, bevor der andere gespeichert wird, daher ist der maximale Wert gleich. Eine mögliche Lösung besteht darin, die Spalte serial zu machen. Wenn dies keine Option ist, können Sie eine Ereigniswarteschlange auf der Serverseite einrichten. Wenn Sie einen neuen Datensatz hinzufügen möchten, können Sie ihn zur Warteschlange hinzufügen, anstatt ihn einzufügen. Auf der anderen Seite kann ein Cron-Job oder ein Heartbeat-Job die Warteschlange regelmäßig überprüfen, und wenn sie nicht leer ist, dann führe die Befehle sequentiell aus.

+0

von Ihrem Kommentar, ist es möglich, meine Spalte zu ändern sei seriell, weil ich versucht habe, das zu überprüfen, und scheint, dass ich die vorhandene Spalte zu SERIAL nicht ändern kann ... – user6781731

+0

@ user6781731 das ist, weil du doppelte Daten hast. Über die Änderung, siehe http://stackoverflow.com/questions/27307835/how-to-convert-primary-key-from-integer-to-serial –

+0

@ user6781731 Sie möglicherweise auch Lücken haben. Ich glaube, Sie sollten die Online-Anwendung stoppen, eine temporäre Tabelle erstellen, wo Sie eine serielle Version der Spalte haben und alle Datensätze kopieren, Ihre Haupttabelle löschen, sie mit der richtigen Struktur neu erstellen, die Daten aus der temporären Tabelle zurückmigrieren, Entfernen Sie die temporäre Tabelle und starten Sie Ihre Anwendung neu. –

Verwandte Themen