Warum erhöht sich die automatische Vergrößerung von MySQL bei fehlgeschlagenen Einfügungen?
Einem co-worker nur hat mir bewusst gemacht, der ein sehr seltsames MySQL Verhalten.
Vorausgesetzt, Sie haben eine Tabelle mit einem auto_increment-Feld und ein weiteres Feld, das eindeutig ist (z.B. eine Benutzername-Feld). Wenn Sie versuchen, einfügen einer Zeile mit Benutzername das ist bereits in der Tabelle einfügen ausfällt, als erwartet. Doch den auto_increment-Wert erhöht ist, wie gesehen werden kann, wenn Sie eine gultige neuen Eintrag nach mehreren gescheiterten versuchen.
Zum Beispiel, wenn unsere Letzte Eintrag sieht so aus...
ID: 10
Username: myname
...und wir versuchen, fünf neue Einträge mit dem gleichen Benutzernamen Wert auf unser Nächstes fügen wir eine neue Zeile etwa so:
ID: 16
Username: mynewname
Zwar ist dies nicht ein großes problem in sich, wie es scheint, eine sehr dumme Angriffen zu töten, einen Tisch und überfluten es mit fehlgeschlagenen insert-Anfragen, die MySQL-Referenz-Handbuch sagt:
"Das Verhalten von auto-increment-Mechanismus ist nicht definiert, wenn [...] der Wert wird größer als die maximale ganze Zahl, die gespeichert werden in der angegebenen integer-Typ."
Ist dieses Verhalten zu erwarten?
InformationsquelleAutor der Frage Sorcy | 2010-05-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
InnoDB
ist ein Transaktions-engine.Dies bedeutet, dass in dem folgenden Szenario:
Session A
fügt Datensatz1
Session B
fügt Datensatz2
Session A
rollt sich zurückist, gibt es entweder eine Möglichkeit, eine Lücke oder
session B
würde sperren, bis diesession A
commit oder Rollback.InnoDB
Designer (wie die meisten anderen transaktionale engine Designer) wählte zu ermöglichen, Lücken.Aus der Dokumentation:
Wenn Sie Angst vor der
id
Spalte umwickeln, damit esBIGINT
(8 byte lang).InformationsquelleAutor der Antwort Quassnoi
Ohne die genaue Kenntnis der Interna, ich würde ja sagen, dass der auto-increment ermöglichen SOLLTE übersprungen Werte, um Fehler-Einsätze. Können sagen, Sie tun, eine banking-Transaktion, oder andere, wo die gesamte Transaktion und mehrere Datensätze als ein alles-oder-nichts. Wenn Sie versuchen, Ihre einfügen, erhalten Sie eine ID, dann Stempel alle nachfolgenden Angaben mit, die Transaktions-ID und legen Sie die detail-Datensätze, die Sie benötigen, um sicherzustellen, dass Ihre qualifizierten Einzigartigkeit. Wenn Sie mehrere Leute zuschlagen der Datenbank, Sie werden auch brauchen, um sicherzustellen, Sie bekommen Ihre eigene Transaktions-ID, um nicht in Konflikt mit Ihnen, wenn Ihre Transaktion wird committed. Wenn etwas nicht auf die erste Transaktion, die keinen Schaden getan, und keine baumelnden Elemente downstream.
InformationsquelleAutor der Antwort DRapp
Alte post,
aber dies kann den Menschen helfen,
Sie haben um innodb_autoinc_lock_mode zu 0 oder 2.
System-Variablen, die einen numerischen Wert angegeben werden kann
--var_name=value
auf der Kommandozeile oder alsvar_name=value
im option-Dateien.Command-Line-parameter format:
ODER
Öffnen Sie Ihre mysql.ini und fügen Sie folgende Zeile ein :
InformationsquelleAutor der Antwort DavidA
Weiß ich, dass dies ein Alter Artikel, aber da ich auch nicht finden konnte, die richtige Antwort, ich habe tatsächlich einen Weg gefunden, dies zu tun. Sie haben, um wickeln Sie Ihre Abfrage innerhalb einer if-Anweisung. Seine in der Regel insert-Abfrage oder einfügen und duplizieren von Abfragen, die versauen das organisierte auto-Inkrement, um so für regelmäßige Einsätze Verwendung:
und statt LEGEN UND AUF DOPPELTE verwenden UPDATE SET WHERE ABFRAGE in oder außerhalb einer if-Anweisung egal ist und ein ERSETZEN Sie IN der ABFRAGE auch nicht zu funktionieren scheinen,
InformationsquelleAutor der Antwort ThinkkSo