MySQL-Transaktion bezieht sich auf die Ausführung einer Reihe von Vorgängen in der Datenbank. Diese Vorgänge werden letztendlich alle erfolgreich sein oder fehlschlagen, und es wird keinen Teilerfolg geben. Eine Transaktion ist eine atomare Operation und eine minimale Ausführungseinheit. die aus einer oder mehreren SQL-Anweisungen bestehen kann.
Die Betriebsumgebung dieses Tutorials: Windows 10-System, MySQL Version 5.7, Dell G3-Computer.
Detaillierte Erläuterung der Transaktionen
Was ist eine Transaktion?
Eine Transaktion in einer Datenbank bezieht sich auf die Ausführung einer Reihe von Vorgängen in der Datenbank. In derselben Transaktion werden diese Vorgänge entweder alle erfolgreich sein oder fehlschlagen.
Eine Transaktion ist eine atomare Operation. Ist eine minimale Ausführungseinheit. Es kann aus einer oder mehreren SQL-Anweisungen bestehen. Wenn in derselben Transaktion alle SQL-Anweisungen erfolgreich ausgeführt werden, ist die gesamte Transaktion erfolgreich. Wenn eine SQL-Anweisung nicht ausgeführt werden kann, schlägt die gesamte Transaktion fehl.
Zum Beispiel:
Zum Beispiel überweist Benutzer A 100 an Benutzer B. Der Vorgang ist wie folgt:
100 von Konto A abziehen
100 auf Konto B hinzufügen
Mit der Unterstützung von Transaktionen werden die Das obige Ergebnis liefert nur zwei Ergebnisse:
Der Vorgang ist erfolgreich: Konto A wird um 100 reduziert; Konto B wird um 100 erhöht.
Der Vorgang schlägt fehl: Es gibt keine Änderung in beiden Konten A und B.
Wenn keine Transaktionsunterstützung vorliegt, kann ein Fehler auftreten: Konto A wurde um 100 reduziert, aber das System war zu diesem Zeitpunkt nicht verfügbar. Infolgedessen wurden 100 nicht zu Konto B hinzugefügt, während Konto A 100 aus dem Nichts verloren hat.
Verschiedene Merkmale von Transaktionen (ACID) – Kernpunkte
Atomarität (Atomarität) Der gesamte Prozess einer Transaktion ist wie eine atomare Operation. Am Ende ist diese Atomizität entweder alle erfolgreich aus dem Endergebnis bestimmt Aus der Sicht des Endergebnisses ist dieser Prozess untrennbar miteinander verbunden.
KonsistenzEine Transaktion muss die Datenbank von einem Konsistenzzustand in einen anderen Konsistenzzustand ändern.
Lassen Sie uns zunächst die Definition von Konsistenz überprüfen. Die sogenannte Konsistenz bedeutet, dass sich die Daten in einem sinnvollen Zustand befinden, und zwar
semantisch
und nicht grammatisch . Das häufigste Beispiel sind Geldtransfers. Wenn beispielsweise ein Geldbetrag von Konto A auf Konto B übertragen wird und der Geldbetrag auf Konto A abnimmt, der Geldbetrag auf Konto B jedoch nicht zunimmt, gehen wir davon aus, dass sich die Daten zu diesem Zeitpunkt in einem inkonsistenten Zustand befinden.
Aus dem Verständnis dieses Absatzes bedeutet die sogenannte Konsistenz, dass das Endergebnis aus der tatsächlichen Geschäftslogik korrekt ist und vollständig mit den erwarteten Ergebnissen des Programmierers übereinstimmt.
Isolation IsolationDie Ausführung einer Transaktion kann nicht durch andere Transaktionen beeinträchtigt werden. Das heißt, die innerhalb einer Transaktion verwendeten Vorgänge und Daten sind von anderen gleichzeitigen Transaktionen isoliert und gleichzeitig ausgeführte Transaktionen können sich nicht gegenseitig stören.
Hier ist die Isolationsstufe der Transaktion:
Lesen nicht festgeschrieben: Lesen nicht festgeschrieben
Lesen festgeschrieben: Lesen festgeschrieben
Wiederholbares Lesen: wiederholbares Lesen
Serialisierbar: serialisierbar
HaltbarkeitEinmal pro Wenn eine Transaktion festgeschrieben wird, sollten ihre Änderungen an den Daten in der Datenbank dauerhaft sein. Wenn die Transaktion festgeschrieben wird, werden die Daten auf der Festplatte gespeichert und die Änderung ist dauerhaft.
Transaktionsvorgänge in MySQLTransaktionen in MySQL sind standardmäßig implizite Transaktionen. Wenn Einfüge-, Aktualisierungs- und Löschvorgänge ausgeführt werden, startet die Datenbank automatisch die Transaktion, schreibt sie fest oder setzt sie zurück.
Ob implizite Transaktionen aktiviert werden, wird durch die Variable Autocommit gesteuert.
Transaktionen werden also in
implizite Transaktionen
und explizite Transaktionen unterteilt.
Implizite TransaktionenTransaktionen werden automatisch geöffnet, übermittelt oder zurückgesetzt, z. B. Anweisungen zum Einfügen, Aktualisieren oder Löschen. Das Öffnen, Senden oder Zurücksetzen von Transaktionen wird intern automatisch von MySQL gesteuert.
Überprüfen Sie, ob die Variable Autocommit für die automatische Übermittlung aktiviert ist.
1
mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | ON |+---------------+-------+1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren
Autocommit ist aktiviert, wenn die automatische Übermittlung aktiviert ist.
Explizite TransaktionenTransaktionen müssen manuell geöffnet, übermittelt oder zurückgesetzt werden und werden vom Entwickler selbst gesteuert.
2 Möglichkeiten zur manuellen Steuerung von Transaktionen:
mysql> show variables like 'transaction_isolation';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | READ-COMMITTED |+-----------------------+----------------+1 row in set, 1 warning (0.00 sec)
mysql> show variables like 'transaction_isolation';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | READ-UNCOMMITTED |+-----------------------+----------------+1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren
先清空test1表数据:
1
deletefrom test1;select * from test1;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
按时间顺序在2个窗口中执行下面操作:
时间
窗口A
窗口B
T1
start transaction;
T2
select * from test1;
T3
start transaction;
T4
insert into test1 values (1);
T5
select * from test1;
T6
select * from test1;
T7
commit;
T8
commit;
A窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 |+------+1 row in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)
Nach dem Login kopieren
B窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test1 values (1);Query OK, 1 row affected (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 |+------+1 row in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'transaction_isolation';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | READ-COMMITTED |+-----------------------+----------------+1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren
Nach dem Login kopieren
先清空test1表数据:
1
deletefrom test1;select * from test1;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
按时间顺序在2个窗口中执行下面操作:
时间
窗口A
窗口B
T1
start transaction;
T2
select * from test1;
T3
start transaction;
T4
insert into test1 values (1);
T5
select * from test1;
T6
select * from test1;
T7
commit;
T8
select * from test1;
T9
commit;
A窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 |+------+1 row in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)
Nach dem Login kopieren
B窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test1 values (1);Query OK, 1 row affected (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 |+------+1 row in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'transaction_isolation';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+----------------+1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren
Nach dem Login kopieren
先清空test1表数据:
1
deletefrom test1;select * from test1;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
按时间顺序在2个窗口中执行下面操作:
时间
窗口A
窗口B
T1
start transaction;
T2
select * from test1;
T3
start transaction;
T4
insert into test1 values (1);
T5
select * from test1;
T6
select * from test1;
T7
commit;
T8
select * from test1;
T9
commit;
T10
select * from test1;
A窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> select * from test1;Emptyset (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 || 1 |+------+2 rows in set (0.00 sec)
Nach dem Login kopieren
B窗口如下:
1
mysql> start transaction;Query OK, 0 rows affected (0.00 sec)mysql> insert into test1 values (1);Query OK, 1 row affected (0.00 sec)mysql> select * from test1;+------+| a |+------+| 1 || 1 |+------+2 rows in set (0.00 sec)mysql> commit;Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'transaction_isolation';+-----------------------+----------------+| Variable_name | Value |+-----------------------+----------------+| transaction_isolation | REPEATABLE-READ |+-----------------------+----------------+1 row in set, 1 warning (0.00 sec)
mysql> show variables like 'transaction_isolation';+-----------------------+--------------+| Variable_name | Value |+-----------------------+--------------+| transaction_isolation | SERIALIZABLE |+-----------------------+--------------+1 row in set, 1 warning (0.00 sec)
Nach dem Login kopieren
先清空test1表数据:
1
deletefrom test1;select * from test1;
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
按时间顺序在2个窗口中执行下面操作:
时间
窗口A
窗口B
T1
start transaction;
T2
select * from test1;
T3
start transaction;
T4
insert into test1 values (1);
T5
commit;
T6
commit;
Führen Sie die oben genannten Befehle in chronologischer Reihenfolge aus und Sie werden feststellen, dass T4-B blockiert ist, bis T5-A abgeschlossen ist.
Die obige Demonstration zeigt die Auswirkung des gegenseitigen Lese-/Schreibausschlusses. Sie können selbst über die Auswirkung des gegenseitigen Lese-/Schreibausschlusses schreiben.
Es ist ersichtlich, dass Transaktionen nur seriell ausgeführt werden können. In seriellen Situationen gibt es keine Probleme mit Dirty Reads, nicht wiederholbaren Reads und Phantom Reads.
Zusammenfassung
Read Uncommitted (Read Uncommitted)
Read Uncommitted ist die Transaktionsebene mit der niedrigsten Isolationsstufe. Unter dieser Isolationsstufe liest eine Transaktion aktualisierte, aber nicht festgeschriebene Daten von einer anderen Transaktion. Wenn die andere Transaktion zurückgesetzt wird, handelt es sich bei den von der aktuellen Transaktion gelesenen Daten um schmutzige Daten.
Read Committed
Unter der Isolationsstufe „Read Committed“ kann bei einer Transaktion das Problem des nicht wiederholbaren Lesens auftreten. Nicht wiederholbares Lesen bedeutet, dass dieselben Daten innerhalb einer Transaktion mehrmals gelesen werden. Wenn eine andere Transaktion diese Daten vor dem Ende der Transaktion ändert, werden die Daten in der ersten Transaktion möglicherweise zweimal gelesen.
Unter der Isolationsstufe „Wiederholbarer Lesevorgang“ kann bei einer Transaktion das Problem des Phantom-Lesevorgangs auftreten. Phantomlesen bedeutet, dass Sie bei der ersten Abfrage eines bestimmten Datensatzes feststellen, dass dieser nicht vorhanden ist. Wenn Sie jedoch versuchen, diesen nicht vorhandenen Datensatz zu aktualisieren, können Sie erfolgreich sein und denselben Datensatz erneut lesen , es funktioniert wie von Zauberhand. Beim Phantomlesen handelt es sich um einen Datensatz, der nicht gelesen wurde und von dem angenommen wird, dass er nicht existiert. Tatsächlich kann er jedoch erfolgreich aktualisiert werden. Darüber hinaus wird er nach erfolgreicher Aktualisierung angezeigt, wenn er erneut gelesen wird.
Serializable
Serializable ist die strengste Isolationsstufe. Unter der Isolationsstufe „Serialisierbar“ werden alle Transaktionen der Reihe nach ausgeführt, sodass keine Dirty Reads, nicht wiederholbaren Lesevorgänge und Phantom Reads auftreten.
Obwohl Transaktionen unter der Isolationsstufe „Serialisierbar“ die höchste Sicherheit aufweisen, wird die Effizienz stark reduziert und die Leistung der Anwendung drastisch reduziert, da die Transaktionen seriell ausgeführt werden. Wenn keine besonders wichtige Situation vorliegt, wird die Isolationsstufe Serializable im Allgemeinen nicht verwendet.
Standardisolationsstufe: Wenn keine Isolationsstufe angegeben ist, verwendet die Datenbank die Standardisolationsstufe. Wenn Sie in MySQL InnoDB verwenden, ist die Standardisolationsstufe Wiederholbares Lesen.
Über die Wahl der Isolationsstufe
Sie müssen die Phänomene, die durch verschiedene Isolationsstufen verursacht werden, gut verstehen, dann können Sie die Wahl problemlos treffen
Je höher die Isolationsstufe, desto niedriger die Parallelität führt beispielsweise dazu, dass Dinge seriell ausgeführt werden, wodurch gleichzeitige Vorgänge seriell werden und die Systemleistung direkt verringert wird.
Die konkrete Wahl muss auf dem jeweiligen Unternehmen basieren.
READ-COMMITTED wird normalerweise häufiger verwendet.
Zusammenfassung
Verstehen Sie die 4 Merkmale von Transaktionen: Atomizität, Konsistenz, Isolation und Haltbarkeit.
Beherrschen Sie die Einführung allgemeiner Befehle für Transaktionsvorgänge Transaktion starten: Transaktion starten
Transaktion starten schreibgeschützt: schreibgeschützte Transaktion öffnen
commit: Transaktion festschreiben
rollback: Transaktion zurücksetzen
savepoint: Speicherpunkt festlegen
rollback zum Speicherpunkt: Sie können zu einem Speicherort zurückkehren Punkt
Beherrschen Sie die 4 Isolationsstufen und verstehen Sie ihre Eigenschaften
Dirty Read, nicht wiederholbares Lesen, Phantom Read
[Verwandte Empfehlungen:
MySQL-Video-Tutorial
]
Das obige ist der detaillierte Inhalt vonWas ist eine MySQL-Transaktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn