Ich verwende PHP / MySQL, um beim Öffnen des Eingabebildschirms einen Zählercode für jeden Eintrag zu erzeugen.
Hier ist der Code, den ich verwende
%Vor%Dieser Code wird korrekt generiert und dem Benutzer angezeigt, bevor er den Datensatz erstellt. Das Problem tritt auf, wenn mehrere Benutzer dieselbe Zeit öffnen, in der der Code in ihren Anzeigen dupliziert wird.
Was ist die Methode, um die Duplikate zu vermeiden?
Ich habe versucht, eine separate Tabelle zu erstellen, um die letzte Nummer zu speichern und für jede Anfrage inkrementiert zu werden, aber das Problem ist, wenn der Benutzer die Eingabe abbricht, diese Nummer fehlt.
BEARBEITEN
Der Code funktioniert ordnungsgemäß, wenn ein Benutzer den Code generiert und den Datensatz einfügt. Aber das Problem ist, wenn mehrere Benutzer gleichzeitig geöffnet werden, erzeugt sie die gleiche Nummer auf ihrem Bildschirm. Wenn alle versuchen, den Datensatz zu speichern, wird er dupliziert. Bitte beachten Sie, dass ich diese Nummer erzeuge und in der Eingabemaske zunächst nicht beim Speichern des Datensatzes zeige.
Ich nehme an, dass der in der Frage angezeigte Code vereinfacht ist und Sie die AUTO_INCREMENT-Spalte nicht wie von einer anderen Antwort vorgeschlagen verwenden können.
Sie müssen die Tabelle zum Lesen sperren, bis sie aktualisiert ist. Führen Sie die MySQL-Abfragen in der folgenden Reihenfolge durch:
%Vor%Weitere Informationen zum Sperren ganzer Tabellen finden Sie hier: Ссылка
Wenn Sie die InnoDB-Speicher-Engine verwenden, können Sie hier mehr über erweiterte (Zeilen-) Sperren und Transaktionen lesen: Ссылка
Folgendes müssen Sie tun:
Erstellen Sie zuerst eine Tabelle:
%Vor%Zweitens, benutze diesen Code (ich weiß nicht, welchen MySQL-Code du benutzt, also werde ich den üblichen verwenden):
%Vor%Wenn Sie einfügen und nicht auswählen, sind Sie sicher, dass Sie kein Duplikat haben.
Das Erstellen eines eigenen autoinkrementierenden Bezeichners ist schwierig und fehleranfällig, wie Sie festgestellt haben. Sie sollten darüber nachdenken, die Funktion MySQL AUTO_INCREMENT und die entsprechende% co_de zu verwenden Funktion%, die die ID des zuletzt eingefügten Datensatzes in dieser Sitzung zurückgibt .
Wichtiger Auszug aus diesem Link:
Diese Funktionen sind verbindungsspezifisch, ihre Rückgabewerte sind also nicht von einer anderen Verbindung betroffen, die auch Einfügungen durchführt.
Sie müssen jedoch Ihren Ansatz ändern. Anstatt eine ID auf dem Bildschirm anzuzeigen, bevor der Datensatz erstellt wird, müssen Sie bis zum Einfügen des Datensatzes warten. ODER wenn Sie diese ID wirklich anzeigen müssen, fügen Sie einen leeren Datensatz ein, um die ID zu erstellen und zurückzugeben, und bearbeiten Sie diesen Datensatz dann anhand von benutzerdefinierten Daten, anstatt eine Einfügung durchzuführen.
Eine besorgniserregende Idee ist, dass Sie dem Benutzer des Systems den internen Primärschlüssel zeigen müssen. Der Schlüssel ist nicht natürlich (solche vom Staat ausgegebenen Identifikatoren) und wird vom System generiert. Das riecht ein bisschen schlechtes Design. In der Regel werden Primärschlüsselwerte dem Benutzer nie angezeigt, und es wird eine andere Ersatzkennung verwendet.