Die Auto-Increment-IDs von MySQL definieren alle einen Anfangswert und erhöhen dann kontinuierlich die Schrittweite. Obwohl für natürliche Zahlen keine Obergrenze existiert, ist die zur Darstellung der Zahl verwendete Bytelänge definiert, sodass auch für den Computerspeicher eine Obergrenze existiert. Beispielsweise ist ein vorzeichenloser int 4 Bytes lang und seine Obergrenze beträgt Tabellendefinition - automatische Inkrementierung der IDDie Logik der Tabellendefinition, nachdem der Auto-Inkrement-Wert die Obergrenze erreicht hat, lautet: Bei der Beantragung der nächsten ID bleibt der erhaltene Wert unverändert. mysql> Tabelle erstellen t(id int unsigned auto_increment Primärschlüssel) auto_increment=4294967295; Abfrage OK, 0 Zeilen betroffen (0,01 Sek.) mysql> in t-Werte einfügen (null); Abfrage OK, 1 Zeile betroffen (0,00 Sek.) mysql> anzeigen, Tabelle erstellen t; +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Tabelle | Tabelle erstellen | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t | TABELLE ERSTELLEN `t` ( `id` int unsigned NICHT NULL AUTO_INCREMENT, PRIMÄRSCHLÜSSEL (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4294967295 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci | +-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 Zeile im Satz (0,00 Sek.) //Eine Zeile mit 4294967295 wurde erfolgreich eingefügt mysql> in t-Werte einfügen (null); FEHLER 1062 (23000): Doppelter Eintrag „4294967295“ für Schlüssel „t.PRIMARY“ Nachdem der erste Einfügevorgang erfolgreich war, beträgt der AUTO_INCREMENT-Wert der Tabelle immer noch 4294967295, was dazu führt, dass der zweite Einfügevorgang denselben Auto-Increment-ID-Wert erhält und dann versucht, die Einfügeanweisung auszuführen, was zu einem Primärschlüsselkonflikt führt. Das InnoDB-System erhöht automatisch die row_id Wenn Sie eine InnoDB-Tabelle erstellen, ohne einen Primärschlüssel anzugeben, erstellt InnoDB automatisch eine unsichtbare 6-Byte-Zeilen -ID . InnoDB verwaltet einen globalen Für alle InnoDB-Tabellen ohne Primärschlüssel wird bei jedem Einfügen einer Datenzeile die aktuelle Wenn der Code implementiert ist, ist row_id eine vorzeichenlose lange Ganzzahl (Bigtint unsigned) mit einer Länge von 8 Bytes. Als InnoDB jedoch entworfen wurde, war die Länge von row_id nur 6 Bytes, sodass beim Schreiben in die Datentabelle nur die letzten 6 Bytes platziert wurden. Daher hat der Wert von row_id , der in die Datentabelle geschrieben werden kann, zwei Eigenschaften:
Das heißt, die in die Tabelle geschriebene Zeilen-ID liegt zwischen Überprüfen Sie diese Schlussfolgerung: Ändern Sie die automatische Inkrementierung der Row_ID des Systems über GDB. GDB wird verwendet, um die Reproduktion von Problemen zu erleichtern und kann nur in einer Testumgebung verwendet werden. row_id ist in der Überprüfungssequenz aufgebraucht
Überprüfung der Wirkung nach der Anwendung Es ist ersichtlich, dass, nachdem ich gdb verwendet habe, um dict_sys.row_id auf 2^48 festzulegen, das Einfügen von a=2 in der ersten Zeile der Tabelle t erscheint, weil die row_id dieses Werts 0 ist. Daher sollten Sie in der InnoDB-Tabelle aktiv einen Auto-Inkrement-Primärschlüssel erstellen: Wenn die Auto-Inkrement-ID der Tabelle die Obergrenze erreicht, wird beim Einfügen von Daten ein Primärschlüsselkonfliktfehler gemeldet. XidDas Redo-Protokoll und das Binärprotokoll verfügen über ein gemeinsames Feld „Xid“, das zur Zuordnung zu Transaktionen verwendet wird. Wie wird Xid in MySQL generiert? MySQL verwaltet intern eine globale Variable Bei jeder Ausführung der Anweisung wird sie der Wenn die aktuelle Anweisung die erste von der Transaktion ausgeführte Anweisung ist, weist MySQL der Xid der Transaktion auch
Nach dem Neustart von MySQL wird jedoch eine neue Binlog-Datei neu generiert, die sicherstellt, dass die XID in derselben Binlog-Datei eindeutig ist. Obwohl ein MySQL-Neustart nicht dazu führt, dass zwei identische Xids im selben Binärprotokoll erscheinen, wird die Zählung von 0 an fortgesetzt, wenn Da
Innodb trx_id Xid wird von der Serverebene verwaltet Aber InnoDBs eigene trx_id ist eine separat verwaltete Transaktions-ID. InnoDB verwaltet intern eine globale Variable max_trx_id. Jedes Mal, wenn eine neue trx_id erforderlich ist, wird der aktuelle Wert von max_trx_id abgerufen und dann max_trx_id um 1 erhöht. Die Kernidee der InnoDB-DatensichtbarkeitJede Datenzeile zeichnet die trx_id auf, die sie aktualisiert. Wenn eine Transaktion eine Datenzeile liest, bestimmt sie, ob die Daten sichtbar sind, indem sie die konsistente Ansicht der Transaktion mit der trx_id der Datenzeile vergleicht. Für die ausgeführte Transaktion können Sie die trx_id der Transaktion in der Tabelle information_schema.innodb_trx sehen. Siehe folgendes Beispiel: trx_id der Transaktion
Ausführungsprotokoll von S2: mysql> verwende Informationsschema; Einlesen von Tabelleninformationen zur Vervollständigung von Tabellen- und Spaltennamen Sie können diese Funktion deaktivieren, um einen schnelleren Start mit -A zu erhalten Datenbank geändert mysql> wähle trx_id, trx_mysql_thread_id aus innodb_trx; +-----------------+---------------------+ | trx_id | trx_mysql_thread_id | +-----------------+---------------------+ | 421972504382792 | 70 | +-----------------+---------------------+ 1 Zeile im Satz (0,00 Sek.) mysql> wähle trx_id, trx_mysql_thread_id aus innodb_trx; +---------+---------------------+ | trx_id | trx_mysql_thread_id | +---------+---------------------+ | 1355623 | 70 | +---------+---------------------+ 1 Zeile im Satz (0,01 Sek.) S2 ruft diese beiden Felder aus der Tabelle innodb_trx ab. Das zweite Feld Die bei t2 angezeigte trx_id ist eine sehr große Zahl; die bei t4 angezeigte trx_id ist 1289, was wie eine relativ normale Zahl aussieht. Warum ist das so?
Wenn neben den offensichtlichen Änderungsanweisungen nach der Select-Anweisung ein „for update“ hinzugefügt wird, handelt es sich nicht um eine schreibgeschützte Transaktion.
Woher stammt die große Zahl, die bei t2 gefunden wurde? Dadurch wird Folgendes sichergestellt:
Warum 248 hinzufügen? Stellen Sie sicher, dass der für schreibgeschützte Transaktionen angezeigte trx_id-Wert relativ groß ist, sodass er unter normalen Umständen von der ID von Lese-/Schreibtransaktionen unterschieden werden kann. Die Logik von trx_id ähnelt jedoch der von row_id und ist als 8 Bytes definiert. Warum wird schreibgeschützten Transaktionen keine trx_id zugewiesen?
Da schreibgeschützte Transaktionen trx_id nicht zuweisen, verlangsamt sich die Wachstumsrate von trx_id offensichtlich. Wenn dieser Zustand erreicht ist, weist MySQL weiterhin einen Dirty-Read-Bug auf: Dirty Read reproduzieren Da die max_trx_id des Systems auf 2^48 - 1 eingestellt ist, beträgt die niedrige Wassermarke der in Sitzung A gestarteten Transaktion TA 2^48 - 1. Bei t2:
Bei t3: Sitzung A führt eine ausgewählte Sichtbarkeitsbeurteilung durch: Die trx_id (0) der Datenversion c=3 ist kleiner als die niedrige Wassermarke der Transaktion TA (2^48 - 1), daher werden die Daten als sichtbar betrachtet. Aber das ist eine schmutzige Lektüre. Und Dies kann auch zu einem tieferen Verständnis von Niedrigwassermarken und Datensichtbarkeit führen. Thread-ID Das System speichert eine globale Variable Jedes Mal, wenn eine neue Verbindung erstellt wird, wird Sie werden jedoch in Die Logik zum Zuweisen ZusammenfassenJede Auto-Increment-ID hat ihr eigenes Anwendungsszenario und verhält sich nach Erreichen der Obergrenze anders:
Dies ist das Ende dieses Artikels darüber, was zu tun ist, wenn die Online-MySQL-Autoinkrement-ID erschöpft ist. Weitere Informationen zur Erschöpfung der MySQL-Autoinkrement-ID finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Interner Ereignisrückruf der Webkomponentenkomponente und Problempunktanalyse
>>: Die Tabelle fügt Zellen und das img-Bild zusammen, um das gesamte td-HTML auszufüllen
Ich glaube, dass jeder manchmal Daten kopieren un...
Dies scheint mit der neuen Version nicht mehr mög...
Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...
Inhaltsverzeichnis Vorwort Frontend-Struktur Back...
Inhaltsverzeichnis 1. Was ist JSONP 2. JSONP-Cros...
Der spezifische Code lautet wie folgt: Der HTML-C...
Funktion: Datenanzeige, Tabellenanwendungsszenari...
Makrotasks und Mikrotasks JavaScript ist eine Sin...
1. Einleitung: Wenn wir Flash-Inhalte normal auf d...
Der Linux-Stream-Editor ist eine nützliche Möglic...
Umfeld Name Eigentum CPU x5650 Erinnerung 4G Sche...
/****************** * Erweiterter Zeichengerätetr...
Die äußerste BoxF dreht sich um 120 Grad, die zwe...
Einführung Als ich mehr über die Datenbanktheorie...
Inhaltsverzeichnis Einführung 1. Gesamtarchitektu...