Detaillierte Erklärung der Verwendung der MySQL-Transaktionsverarbeitung und Beispielcode

Detaillierte Erklärung der Verwendung der MySQL-Transaktionsverarbeitung und Beispielcode

Die MySQL-Transaktionsunterstützung ist nicht an den MySQL-Server selbst gebunden, sondern bezieht sich auf die Speicher-Engine.

1.MyISAM: unterstützt keine Transaktionen und wird für schreibgeschützte Programme verwendet, um die Leistung zu verbessern
2. InnoDB: unterstützt ACID-Transaktionen, Zeilensperren und Parallelität
3. Berkeley DB: Unterstützung für Transaktionen

Eine Transaktion ist eine sequentielle Reihe von Datenbankoperationen, die ausgeführt werden, als handele es sich um eine einzelne Arbeitseinheit. Mit anderen Worten: Eine Transaktion ist erst dann abgeschlossen, wenn jede einzelne Operation innerhalb der Gruppe erfolgreich ist. Wenn eine beliebige Operation in einer Transaktion fehlschlägt, schlägt die gesamte Transaktion fehl.
In der Praxis werden Sie viele SQL-Abfragen zu einer Gruppe zusammenfassen und sie alle zusammen als Teil einer Transaktion ausführen.

Merkmale der Transaktionen:

Transaktionen haben die folgenden vier Standardeigenschaften, die oft mit dem Akronym ACID bezeichnet werden:

Atomarität: Stellen Sie sicher, dass alle Vorgänge innerhalb einer Arbeitseinheit erfolgreich abgeschlossen werden. Andernfalls wird die Transaktion an der Fehlerstelle abgebrochen und vorherige Vorgänge werden auf den vorherigen Zustand zurückgesetzt.

Konsistenz: Stellen Sie sicher, dass die Datenbank nach einer erfolgreichen Transaktion ihren Status korrekt ändert.

Isolation: Macht Transaktionsvorgänge unabhängig und transparent.

Dauerhaftigkeit: Sicherstellen, dass die Ergebnisse oder Auswirkungen einer festgeschriebenen Transaktion im Falle eines Systemausfalls bestehen bleiben.

In MySQL werden Transaktionen mit COMMIT- oder ROLLBACK-Anweisungen begonnen und beendet. Zwischen den SQL-Befehlen, die die Anweisung beginnen und beenden, wird eine große Transaktion gebildet.

COMMIT & ROLLBACK:

Die beiden Schlüsselwörter Commit und Rollback werden hauptsächlich für MySQL-Transaktionen verwendet.

Wenn eine erfolgreiche Transaktion abgeschlossen ist, sollten durch die Ausgabe eines COMMIT-Befehls die Änderungen an allen beteiligten Tabellen wirksam werden.

Wenn ein Fehler auftritt, sollte ein ROLLBACK-Befehl ausgegeben werden, um alle in der Transaktion referenzierten Tabellen in ihren vorherigen Zustand zurückzusetzen.

Sie können das Transaktionsverhalten steuern, indem Sie eine Sitzungsvariable namens AUTOCOMMIT festlegen. Wenn AUTOCOMMIT auf 1 (Standard) gesetzt ist, wird jede SQL-Anweisung (in einer Transaktion oder nicht) als vollständige Transaktion betrachtet und nach Abschluss standardmäßig festgeschrieben. Wenn AUTOCOMMIT auf 0 gesetzt ist und der Befehl SET AUTOCOMMIT = 0 ausgegeben wird, verhält sich die nachfolgende Anweisungsreihe wie eine Transaktion, bis eine explizite COMMIT-Anweisung ohne aktive Commits ausgegeben wird.

Diese SQL-Befehle können in PHP mithilfe der Funktion mysql_query() ausgeführt werden.

Allgemeine Transaktionsbeispiele

Diese Ereignisabfolge ist unabhängig von der verwendeten Programmiersprache und kann in jeder Sprache erstellt werden, die zum Erstellen des logischen Pfads der Anwendung verwendet wird.

Diese SQL-Befehle können in PHP mithilfe der Funktion mysql_query() ausgeführt werden.

BEGIN WORK startet eine Transaktion und gibt einen SQL-Befehl aus

Geben Sie einen oder mehrere SQL-Befehle wie SELECT, INSERT, UPDATE oder DELETE ein.

Überprüfen Sie, ob Fehler vorliegen und ob alles Ihren Anforderungen entspricht.

Wenn Fehler auftreten, geben Sie den Befehl ROLLBACK ein, andernfalls geben Sie den Befehl COMMIT ein.

Transaktionssichere Tabellentypen in MySQL:

Wenn Sie die transaktionale Programmierung von MySQL verwenden möchten, müssen Sie Tabellen auf besondere Weise erstellen. Es gibt viele Tabellentypen, die Transaktionen unterstützen, aber der beliebteste ist InnoDB.

Beim Kompilieren von MySQL aus dem Quellcode erfordert die InnoDB-Tabellenunterstützung bestimmte Kompilierungsparameter. Wenn Ihre MySQL-Version keine InnoDB-Unterstützung bietet, bitten Sie Ihren Internetdienstanbieter, eine MySQL-Version zu erstellen, die den InnoDB-Tabellentyp unterstützt, oder laden Sie eine MySQL-Max-Binärdistribution für Windows oder Linux/UNIX herunter, installieren Sie sie und verwenden Sie den Tabellentyp in Ihrer Entwicklungsumgebung.

Wenn Ihre MySQL-Installation InnoDB-Tabellen unterstützt, fügen Sie der Anweisung zur Tabellenerstellung einfach eine TYPE=InnoDB-Definition hinzu. Der folgende Code erstellt beispielsweise die InnoDB-Tabelle tcount_tbl:

root@host#mysql -u root -p Passwort;
Passwort eingeben:*******
mysql> verwenden Sie TUTORIALS;
Datenbank geändert
mysql> Tabelle tcount_tbl erstellen
 -> (
 -> tutorial_author varchar(40) NICHT NULL,
 -> Anzahl der Tutorials INT
 -> ) TYP=InnoDB;
Abfrage OK, 0 Zeilen betroffen (0,05 Sek.)

Andere GEMINI- oder BDB-Tabellentypen können verwendet werden, aber es hängt von Ihrer Installation ab, ob sie beide Typen unterstützt.

Da das Projektdesign die Überweisung von Geld beinhaltet, ist eine MySQL-Transaktionsverarbeitung erforderlich, um die Richtigkeit einer Reihe von Verarbeitungsergebnissen sicherzustellen. Bei der Verwendung von Transaktionen ist es unvermeidlich, etwas Geschwindigkeit zu opfern, um die Richtigkeit der Daten sicherzustellen.

Nur InnoDB unterstützt Transaktionen

Atomarität, Konsistenz, Isolierung und Haltbarkeit von Transaktions-ACID

1. Atomarität von Transaktionen Eine Gruppe von Transaktionen ist entweder erfolgreich oder wird zurückgezogen.

2. Bei ungültigen Daten (z. B. Fremdschlüsseleinschränkungen) wird die Transaktion zurückgezogen.

3. Isolationstransaktionen werden unabhängig voneinander ausgeführt.
Wenn das Ergebnis einer Transaktion andere Transaktionen beeinflusst, werden die anderen Transaktionen zurückgezogen.
Eine 100-prozentige Isolierung der Transaktionen erfordert Einbußen bei der Geschwindigkeit.

4. Zuverlässigkeit: Nach einem Software- oder Hardwareabsturz verwendet der InnoDB-Datentabellentreiber Protokolldateien, um diese zu rekonstruieren und zu ändern.
Zuverlässigkeit und hohe Geschwindigkeit können nicht gleichzeitig erreicht werden. Die Option innodb_flush_log_at_trx_commit bestimmt, wann Transaktionen im Protokoll gespeichert werden.

Offene Transaktion

START TRANSACTION oder BEGIN

Transaktion festschreiben (Transaktion schließen)

BEGEHEN

Transaktion abbrechen (Transaktion schließen)

ROLLBACK

Wendepunkt

SPEICHERPUNKT adqoo_1
ROLLBACK ZUM SAVEPOINT adqoo_1

Transaktionen, die vor dem Wiedereintrittspunkt adqoo_1 auftreten, werden festgeschrieben, und Transaktionen, die nach adqoo_1 auftreten, werden ignoriert.

Beendigung der Transaktion

Einstellen des Autocommit-Modus
AUTOCOMMIT SETZEN = 0
Jede SQL-Anweisung ist ein anderer Befehl derselben Transaktion, getrennt durch COMMIT oder ROLLBACK. Nach der Trennung werden alle Transaktionen ohne COMMIT abgebrochen.

Transaktionssperrmodus

Systemvorgabe: Sie müssen nicht auf das Ende einer Transaktion warten und können die Ergebnisse direkt abfragen, jedoch nicht verändern oder löschen.
Nachteil: Die Abfrageergebnisse können veraltet sein.
Vorteile: Es muss nicht auf das Ende einer Transaktion gewartet werden, das Ergebnis kann direkt abgefragt werden.

Der folgende Modus ist erforderlich, um den Sperrmodus einzustellen

1. WÄHLEN SIE ... SPERREN IM TEILENMODUS (gemeinsames Schloss)
Die abgefragten Daten sind die Daten der Datenbank zu diesem Zeitpunkt (die Ergebnisse anderer festgeschriebener Transaktionen wurden hier wiedergegeben).
SELECT muss warten, bis eine Transaktion beendet ist, bevor sie ausgeführt werden kann

2. SELECT ... FOR UPDATE (exklusive Sperre)
Beispiel: SELECT * FROM tablename WHERE id<200
Dann können die Daten mit der ID < 200 und die abgefragten Daten bis zum Ende dieser Transaktion nicht mehr geändert, gelöscht oder SELECT ... LOCK IN SHARE MODE-Operationen ausgeführt werden. Der Unterschied zwischen gemeinsam genutzten Sperren und exklusiven Sperren besteht darin, ob von anderen Clients ausgegebene SELECT ... LOCK IN SHARE MODE-Befehle blockiert werden sollen.

3. EINFÜGEN / AKTUALISIEREN / LÖSCHEN
Alle zugehörigen Daten werden gesperrt, außerdem wird eine exklusive Sperre

4. Anti-Einfügesperre <br /> Beispiel: SELECT * FROM tablename WHERE id>200
Dann kann der Datensatz mit der ID>200 nicht eingefügt werden

5. Deadlock <br /> Deadlocks automatisch erkennen. Der zuerst eingehende Prozess wird ausgeführt, der nachfolgende Prozess erhält eine Fehlermeldung und führt im ROLLBACK-Modus ein Rollback aus.
innodb_lock_wait_timeout = n, um die maximale Wartezeit festzulegen, der Standardwert beträgt 50 Sekunden

Transaktionsisolationsmodus

FESTLEGEN DER TRANSAKTIONSISOLATIONSSTUFE [SESSION|GLOBAL]
LESEN UNCOMMITTED | LESEN COMMITTED | WIEDERHOLBARES LESEN | SERIALISIERBAR

1. Der SET-Befehl ohne SESSION oder GLOBAL ist nur für die nächste Transaktion gültig

2. SITZUNG EINSTELLEN
Legt den Isolationsmodus für die aktuelle Sitzung fest

3. GLOBAL EINSTELLEN
Legen Sie den Isolationsmodus für alle neuen MySQL-Verbindungen fest (ausgenommen die aktuelle Verbindung).
Isolationsmodus
LESEN SIE UNVERBINDLICH
SELECT nicht isolieren
Die Ergebnisse nicht abgeschlossener Änderungen (nicht COMMIT) durch andere Transaktionen werden ebenfalls berücksichtigt.
LESEN SIE ENGAGIERT
Unter Berücksichtigung der COMMIT-Änderungen anderer Transaktionen kann dieselbe SELECT-Anweisung innerhalb derselben Transaktion unterschiedliche Ergebnisse zurückgeben.
WIEDERHOLBARES LESEN (Standard)
Berücksichtigen Sie keine Änderungen, die von anderen Transaktionen vorgenommen wurden. Unabhängig davon, ob andere Transaktionen dieselbe Transaktion mit dem COMMIT-Befehl festgeschrieben haben, gibt dieselbe SELECT-Anweisung dasselbe Ergebnis zurück (vorausgesetzt, die Transaktion nimmt keine Änderungen vor).
SERIALISIERBAR
Ähnlich wie bei REPEATABLE READ werden allen SELECTs gemeinsame Sperren hinzugefügt.

Fehlerbehandlung

Führen Sie die entsprechende Verarbeitung gemäß den Fehlerinformationen durch

Beispiel für die MySQL-Transaktionsverarbeitung

Es gibt zwei Hauptmethoden für die MySQL-Transaktionsverarbeitung

1. Verwenden Sie begin, rollback, commit zur Implementierung

  • beginEine Transaktion starten
  • Rollback der Transaktion
  • Commit-Transaktionsbestätigung

2. Verwenden Sie set direkt, um den automatischen Übermittlungsmodus von MySQL zu ändern

  • MySQL wird standardmäßig automatisch übermittelt, d. h. wenn Sie eine Abfrage übermitteln, wird diese direkt ausgeführt! Kann sein
  • set autocommit = 0 Automatisches Commit deaktivieren
  • set autocommit = 1 Automatisches Commit aktivieren

Um die Transaktionsverarbeitung zu implementieren.

Beachten Sie jedoch, dass bei Verwendung von set autocommit = 0 alle Ihre nachfolgenden SQL-Anweisungen als Transaktionen verarbeitet werden, bis Sie mit Commit bestätigen oder mit Rollback beenden. Beachten Sie, dass Sie mit dem Beenden dieser Transaktion auch eine neue Transaktion starten! Nach der ersten Methode wird nur die aktuelle als Transaktion behandelt!

MySQL unterstützt die Transaktionsverarbeitung nur für Datentabellen vom Typ INNODB und BDB, andere Typen werden nicht unterstützt!

mysql> Test verwenden;
 Datenbank geändert
 mysql> CREATE TABLE `dbtest`(
 -> ID int(4)
 -> ) TYP=INNODB;
Abfrage OK, 0 Zeilen betroffen, 1 Warnung (0,05 Sek.)

mysql> wähle * aus dbtest
 -> ;
Leerer Satz (0,01 Sek.)

mysql> beginnen;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> in dbtest-Werte einfügen (5);
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> in dbtest-Wert einfügen (6);
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> festschreiben;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> wähle * aus dbtest;
+------+
|Ich würde|
+------+
| 5 |
| 6 |
+------+
2 Zeilen im Satz (0,00 Sek.)

mysql> beginnen;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> in dbtest-Werte einfügen (7);
Abfrage OK, 1 Zeile betroffen (0,00 Sek.)

mysql> Rollback;
Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

mysql> wähle * aus dbtest;
+------+
|Ich würde|
+------+
| 5 |
| 6 |
+------+
2 Zeilen im Satz (0,00 Sek.)

MySQL-Transaktionsverarbeitung

PHP-Code kann die Transaktionsverarbeitung durch die folgenden Methoden der vordefinierten PHP-Klasse mysqli implementieren.

  • autocommit(boolean): Mit dieser Methode wird begrenzt, ob die Abfrageergebnisse automatisch übermittelt werden. Wenn der Parameter dieser Methode true ist, werden sie automatisch übermittelt. Wenn der Parameter false ist, wird die automatische Übermittlung deaktiviert. Die MySQL-Datenbank ist standardmäßig auf Autocommit eingestellt.
  • rollback(): Mit dieser Methode in der Klasse mysqli kann eine Transaktion rückgängig gemacht werden.
  • commit(): Mit dieser Methode können alle Abfragen festgeschrieben werden.
<?php
include_once("conn.php");

$id=$_GET[ich];
$conn->autocommit(false);
if(!$conn->query("löschen aus tb_sco wobei id='".$id."'"))
{
 $conn->rollback();
}
if(!$conn->query("löschen aus tb_stu wobei id='".$id."'"))
{
 $conn->rollback();
}
 $conn->commit();
 $conn->autocommit(true);
 echo "ok"
?>

<?php
require('connectDB.php'); //Datenbankverbindung herstellen mssql_query("BEGIN TRANSACTION DEPS02_DEL"); //Transaktion starten $delete_dep_sql="DELETE FROM TBLDEPARTMENT WHERE DEPTID='{$_GET[deptid]}'";
// echo $delete_dep_sql."<br>";
mssql_query($delete_dep_sql); //Datenbank betreiben// var_dump($del_result);
$delete_result = mssql_query("wählen Sie @@ROWCOUNT als ID aus");
: $delete_info = mssql_fetch_array($delete_result);
Fügt $delete_rows zu $delete_info[0];
// var_dump($delete_rows);
mssql_free_result($delete_result);
echo "<Skriptsprache=JavaScript>";
if(true){ //Beurteilen, ob das Commit zurückgesetzt werden soll mssql_query("COMMIT TRANSACTION DEPS02_DEL"); //Transaktion committen echo "alert('delete success!');";
}anders{
mssql_query("ROLLBACK TRANSACTION DEPS02_DEL"); //Rollback-Transaktion echo "alert('Löschen fehlgeschlagen!');";
}
echo "</script>";mssql_close();
?>

Die MySQL-Transaktionsverarbeitung bietet umfangreiche und wichtige Anwendungen zur Lösung praktischer Probleme. Zu den häufigsten Anwendungen zählen Banküberweisungsdienste, E-Commerce-Zahlungsdienste usw. Es ist jedoch zu beachten, dass die Transaktionsverarbeitungsfunktion von MySQL in der MYSIAM-Speicher-Engine nicht unterstützt wird, in der InnoDB-Speicher-Engine jedoch schon. Jetzt werde ich einen Codeabschnitt hochladen, der Ihnen dabei helfen soll, die MySQL-Transaktionsverarbeitung zu verstehen. Es ist ein einfaches Beispiel, aber es integriert Ideen und ich glaube, dass es eine große Hilfe sein wird.

<?php
$conn = mysql_connect('localhost','root','IhrPasswort')oder die(mysql_error());
mysql_select_db('Transaktion',$conn);
mysql_query('Namen auf utf8 festlegen');

//Transaktion erstellenmysql_query('START TRANSACTION') oder die(mysql_error());
$sqlA="Aktualisiere ein festgelegtes Konto=Konto-1";
wenn(!mysql_query($sqlA)){
&nbsp;&nbsp;&nbsp; mysql_query('ROLLBACK') oder exit(mysql_error());//Beurteilen und zurücksetzen, wenn die Ausführung fehlschlägt&nbsp; exit();
}
$sqlB="Aktualisiere B, setze Konto=Konto+1";
wenn(!mysql_query($sqlB)){
&nbsp;&nbsp;&nbsp; mysql_query('ROLLBACK') oder exit(mysql_error());//Beurteilen und zurücksetzen, wenn die Ausführung fehlschlägt&nbsp; exit();
}
mysql_query('COMMIT')or die(mysql_error());//Transaktion ausführen mysql_close($conn);
?>

Der obige Code kann als Transaktionsfluss zur Simulation von Banküberweisungen verwendet werden. Die Tabellen A und B stellen zwei bei einer Bank eröffnete Konten dar. Wenn Konto A 1 Yuan auf Konto B überweist und der Vorgang fehlschlägt, wird die Überweisung auf den ursprünglichen Zustand zurückgesetzt und es werden keine weiteren Aktionen ausgeführt. Im Gegenteil, wenn der Vorgang erfolgreich ausgeführt wird, erhöht sich der verfügbare Kontostand von Konto B um 1 Yuan, andernfalls wird die Transaktion auf den ursprünglichen Zustand zurückgesetzt.

Ich hoffe, dieser Artikel ist hilfreich für Sie. Dies ist das Ende der Einführung in die Verwendung der MySQL-Transaktionsverarbeitung und des Beispielcodes. Ich hoffe, dass alle weiterhin auf unsere Website achten! Wenn Sie MySQL lernen möchten, können Sie weiterhin auf diese Site achten.

Das könnte Sie auch interessieren:
  • Beispiel für eine in Java implementierte MySQL-Transaktionsverarbeitungsoperation
  • Lösung für das Problem der gesperrten Transaktionsverarbeitung mit hoher Parallelität in PHP+MySQL
  • Detaillierte Erläuterung der MySQL-Transaktionsverarbeitung
  • NodeJs verwendet Mysql-Modul zur Implementierung eines Transaktionsverarbeitungsbeispiels
  • Beispiel für die Verwendung von PDO in der MySQL-Transaktionsverarbeitung unter PHP
  • So implementieren Sie die MySQL-Transaktionsverarbeitung in PHP
  • Eine kurze Analyse der MySQL-Transaktionsverarbeitung und -Anwendung
  • Detaillierte Analyse der MySQL-Transaktionsverarbeitung und Tabellensperre

<<:  Verwenden Sie die mail()-Funktion von PHP zum Senden von E-Mails

>>:  Detaillierte Erklärung gängiger Befehle im Docker-Repository

Artikel empfehlen

Beispiel und Lösung für einen SQL-Injection-Sicherheitslückenprozess

Codebeispiel: öffentliche Klasse JDBCDemo3 { öffe...

So aktivieren Sie den Fernzugriff in Docker

Docker-Daemon-Socket Der Docker-Daemon kann über ...

Vue implementiert den Lupeneffekt beim Tab-Umschalten

In diesem Artikelbeispiel wird der spezifische Co...

Native JS implementiert einen sehr gut aussehenden Zähler

Heute zeige ich Ihnen einen gut aussehenden Zähle...

Installationsmethode für komprimierte MySQL 5.6-Pakete

Es gibt zwei Installationsmethoden für MySQL: MSI...

So implementieren Sie das MySQL-Umschalten des Datenspeicherverzeichnisses

So implementieren Sie das MySQL-Umschalten des Da...

Tutorial zur Installation von MySQL8 auf Centos7

Neue Funktionen in MySQL 8: Meine persönliche Mei...

Lösung zur Installation von OpenCV 3.2.0 in Ubuntu 18.04

Laden Sie opencv.zip herunter Installieren Sie di...

So erweitern Sie die Festplattengröße einer virtuellen Maschine

Nachdem Vmvare die Festplattengröße der virtuelle...

Problem beim Testen des nicht autorisierten Zugriffs auf Zookeeper

Inhaltsverzeichnis Vorwort Erkennen des geöffnete...