In diesem Artikel geht es um die Isolation von MySQL-Transaktionen. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Einführung in Transaktionen
Eine Transaktion ist eine Reihe atomarer SQL-Abfragen oder eine unabhängige Arbeit Einheit. Kurz gesagt: Anweisungen innerhalb einer Transaktion werden entweder alle erfolgreich ausgeführt oder alle schlagen fehl.
In Mysql ist die Transaktionsunterstützung auf der Engine-Ebene implementiert, aber nicht alle Mysql-Engines unterstützen Transaktionen. Dies ist einer der wichtigen Gründe, warum MyISAM durch InnoDB ersetzt wurde .
Wenn es um Transaktionen geht, werden wir auf jeden Fall an ACID denken:
Atomizität
Konsistenz
Isolation
Haltbarkeit
Isolationsstufe
Wenn mehrere Transaktionen gleichzeitig in der Datenbank ausgeführt werden, können aufgrund des Transaktionsisolationsniveaus Probleme wie fehlerhafte Lesevorgänge, nicht wiederholbare Lesevorgänge und Phantomlesevorgänge auftreten.
Der SQL-Standard definiert vier Isolationsstufen:
READ UNCOMMITTED (uncommitted read)
Änderungen in der Transaktion, auch wenn diese noch nicht erfolgt sind committet sind für andere Transaktionen sichtbar. Transaktionen können nicht festgeschriebene Daten lesen, was auch als Dirty Read bezeichnet wird.
READ COMMITTE
Nachdem eine Transaktion festgeschrieben wurde, können die Änderungen von anderen Transaktionen gesehen werden. Diese Ebene wird auch als nicht wiederholbares Lesen bezeichnet, da die Ergebnisse unterschiedlich sein können, wenn dieselbe Abfrage in einer Transaktion zweimal ausgeführt wird.
REPEATABLE READ (wiederholbares Lesen)
Während der Ausführung einer Transaktion sind die beim Start der Transaktion angezeigten Daten immer konsistent. Natürlich sind auf dieser Ebene nicht festgeschriebene Datenänderungen auch für andere Transaktionen unsichtbar.
SERIALIZABLE (serialisierbar)
Für dieselbe Datensatzzeile werden sowohl das Schreiben als auch das Lesen gesperrt, wenn ein Lese-/Schreibsperrenkonflikt auftritt, auf die Transaktion wird später zugegriffen Warten Sie, bis die vorherige Transaktion abgeschlossen ist, bevor Sie fortfahren. Dies führt zu vielen Zeitüberschreitungen und Problemen mit Sperrkonflikten.
In Bezug auf die Implementierung wird eine Ansicht in der Datenbank erstellt, und beim Zugriff hat die Logik der Ansicht Vorrang.
Unter der Isolationsstufe des wiederholbaren Lesens wird diese Ansicht beim Start der Transaktion erstellt und während der gesamten Transaktion verwendet.
Unter der Lese-Commit-Isolationsstufe wird diese Ansicht erstellt, wenn die Ausführung der SQL-Anweisung beginnt.
Unter der Isolationsstufe „Lesen, nicht festgeschrieben“ wird der neueste Wert im Datensatz direkt zurückgegeben, ohne das Konzept einer Ansicht.
Unter der serialisierten Isolationsstufe direkt sperren, um parallelen Zugriff zu vermeiden.
wird konfiguriert, indem der Startparameter transaction-isolation
auf die gewünschte Isolationsstufe gesetzt wird.
Aktuelle Einstellungen anzeigen:
mysql> show variables like 'transaction_isolation'; +-----------------------+-----------------+ | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
Kurz gesagt, es ist sinnvoll, wenn verschiedene Isolationsstufen für unterschiedliche Szenarien geeignet sind.
Implementierung der Transaktionsisolation
In MySQL wird bei der Aktualisierung jedes Datensatzes auch ein Rollback-Vorgang aufgezeichnet , kann der neueste Wert des vorherigen Zustands abgerufen werden.
Das System stellt automatisch fest, dass das Rollback-Protokoll gelöscht wird, wenn keine Transaktionen vorhanden sind, die zurückgesetzt werden müssen.
Warum es nicht empfohlen wird, lange Transaktionen zu verwenden:
Lange Transaktionen bedeuten, dass es sehr alte Transaktionsansichten im System gibt, da diese Transaktionen jederzeit auf alle Daten in der Datenbank zugreifen können Bevor diese Transaktion übermittelt wird, müssen die möglicherweise in der Datenbank verwendeten Rollback-Datensätze beibehalten werden, was viel Speicherplatz beansprucht. Gleichzeitig belegen lange Transaktionen auch Sperrressourcen und können zum Ausfall der gesamten Bibliothek führen.
So starten Sie eine Transaktion
Transaktionsanweisung explizit starten, Transaktion beginnen oder starten, Commit bedeutet Commit, return Rollback verwenden.
set autocommit = 0, dieser Befehl deaktiviert die automatische Übermittlung des Threads. Wenn Sie also eine SELECT-Anweisung ausführen, wird die Transaktion gestartet und nicht automatisch festgeschrieben bis Sie Commit oder Rollback aktiv ausführen oder die Verbindung trennen.
Mein persönlicher Vorschlag ist, die Transaktion explizit über die erste Methode zu starten, um das Auftreten langer Transaktionen zu vermeiden.
Wenn im Fall von set autocommit = 1 eine Transaktion explizit mit begin gestartet wird und Commit ausgeführt wird, wird die Transaktion festgeschrieben. Wenn Sie Commit-Arbeit und -Kette ausführen, wird die Transaktion festgeschrieben und die nächste Transaktion wird automatisch gestartet, wodurch auch der Aufwand für die erneute Ausführung der begin-Anweisung eingespart wird.
Lange Transaktionen abfragen:
Die folgende Anweisung besteht darin, Transaktionen abzufragen, die länger als 60 Sekunden dauern
mysql> select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60; Empty set (0.00 sec)
Zusammenfassend lässt sich sagen, dass wir während des Entwicklungsprozesses Versuchen Sie, so wenig wie möglich zu tun. Verwenden Sie lange Transaktionen. Wenn dies nicht vermieden werden kann, stellen Sie sicher, dass der logische Protokollspeicherplatz groß genug ist, und unterstützen Sie das dynamische Protokollspeicherspeicherwachstum. Überwachen Sie die Innodb_trx-Tabelle und melden Sie einen langen Transaktionsalarm.
Empfohlen: „MySQL-Video-Tutorial“
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion zur MySQL-Transaktionsisolation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!