Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum überspringt mysql einige Auto-Increment-IDs?

Dies ist ein Beispiel für die automatische Inkrementsperre in InnoDB:Da Sie zwei Anweisungen gleichzeitig in derselben Sitzung ausführen:Die automatische Inklocksperre wird von der ersten Abfrage abgerufen, und die Autoincrement-Wertgenerierung ist nicht zwischen den Anweisungen verschachtelt - das ist der springende Punkt der Transaktion.

Dies wird immer beabsichtigt passieren:Wenn dies nicht der Fall wäre, würde die Art und Weise, wie die Transaktionen in InnoDB funktionieren, nicht funktionieren. Die Skalierbarkeit unter Lasten vom Typ OLTP wäre schrecklich, da jede Einfügung warten müsste, bis jede andere Einfügung fertig ist, festgeschrieben oder schlimmer noch zurückgesetzt wird.

Das heißt:Wenn Ihre erste Einfügung 5x länger läuft als Ihre zweite und fehlschlägt und zurückgesetzt wird, wird die zweite dennoch abgeschlossen und wurde festgeschrieben. Andernfalls müssten Sie auf ea warten. Abfrage nach der anderen abgeschlossen werden.

Wenn Sie aufeinanderfolgende und absolut eindeutige ID-Nummern benötigen, beziehen Sie sie aus einer anderen Quelle. AutoInc-Spalten garantieren einfach einen eindeutigen Wert – nicht unbedingt eine Monosequenz – das ist ein Serialisierungspunkt und ein Engpass.

Eine Möglichkeit, dies zu umgehen, falls dies anders erforderlich ist:

setze innodb_autoinc_lock_mode = 0 in Ihrer my.cnf/mysql.ini

Beschreibung der automatischen Inc-Sperre in InnoDB und Optionen