Detailliertes Beispiel zur Implementierung von Transaktions-Commit und -Rollback in MySQL

Detailliertes Beispiel zur Implementierung von Transaktions-Commit und -Rollback in MySQL

Vor Kurzem mussten wir eine geplante Migration der Datenbankdaten durchführen. Um zu verhindern, dass die SQL-Anweisung während des Ausführungsprozesses aus irgendeinem Grund einen Fehler meldet, der zu Verwirrung bei der Datenübertragung führen kann, müssen wir die Transaktion unseres Skripts kontrollieren.

Zuerst erstellen wir eine tran_test-Tabelle

Tabelle erstellen tran_test( 
f1 VARCHAR(10) NICHT NULL, 
f2 INT(1) DEFAULT NULL, 
PRIMÄRSCHLÜSSEL (f1) 
)ENGINE=INNODB CHARSET=utf8

Ich möchte zwei Daten in tran_test einfügen, aber um Fehler während des Einfügens zu vermeiden, möchte ich die Einfügeanweisung innerhalb einer Transaktion steuern.

Wenn Sie derzeit die Artikel einiger Leute lesen, werden Sie häufig eine solche Antwort erhalten.

TRANSAKTION STARTEN;  
INSERT INTO tran_test VALUES('A',1); 
INSERT INTO tran_test VALUES('B',2); 
ROLLBACK;

oder

TRANSAKTION STARTEN;  
INSERT INTO tran_test VALUES('A',1); 
INSERT INTO tran_test VALUES('B',2); 
BEGEHEN;

Diese SQL-Anweisungen sehen sehr einfach aus und können tatsächlich ein Commit oder Rollback ausführen.

Aber können wir damit wirklich unser Ziel erreichen? Die Antwort ist nein.

Im ersten Absatz wird beispielsweise ein ROLLBACK für alle Ihre SQL-Anweisungen in der Transaktion ausgeführt, unabhängig davon, ob sie korrekt sind oder nicht. Ein solcher absoluter Rollback macht Ihr SQL bedeutungslos.

Wenn wir Transaktionen wirklich kontrollieren möchten, besteht meine Idee daher darin, eine Anomalieerkennung für das auszuführende SQL durchzuführen. Wenn im SQL keine Ausnahme vorliegt, führen Sie COMMIT aus, wenn eine Ausnahme abgefangen wird, führen Sie ROLLBACK aus.

Jetzt müssen wir eine gespeicherte Prozedur erstellen, um die Ausnahme zu erfassen. COMMIT wird ausgeführt, wenn die Ausführung erfolgreich ist, und ROLLBACK wird ausgeführt, wenn die SQL-Ausführung fehlschlägt.

Es gibt zwei Möglichkeiten, den gewünschten Effekt zu erzielen.

Die erste besteht darin, die Ausnahme des SQL zu erfassen, das wir ausführen möchten. Wir definieren eine Variable t_error. Wenn eine Ausnahme erfasst wird, setzen wir t_error=1. Treffen Sie dann eine bedingte Beurteilung von t_error. Wenn t_error = 1 ist, führen Sie ROLLBACK aus, andernfalls führen Sie COMMIT aus.

VERFAHREN LÖSCHEN, WENN t_test EXISTIERT; 
TRENNUNGSZEICHEN // 
PROZEDUR ERSTELLEN t_test() 
 BEGINNEN 
  DECLARE t_error INTEGER; 
  DECLARE CONTINUE HANDLER FÜR SQLEXCEPTION SET t_error = 1; 
  TRANSAKTION STARTEN; 
     INSERT INTO tran_test VALUES('A',1); 
   INSERT INTO tran_test VALUES('B',2); 
     WENN t_error = 1 DANN 
       ROLLBACK; 
     ANDERS 
       BEGEHEN; 
     ENDE, WENN; 
ENDE// 
Rufen Sie t_test() auf;

Die andere ist eine Vereinfachung der ersten, d. h. wenn eine Ausnahme abgefangen wird, wird ROLLBACK direkt ausgeführt, und wenn keine Ausnahme abgefangen wird, wird COMMIT direkt ausgeführt.

VERFAHREN LÖSCHEN, WENN t_test EXISTIERT; 
TRENNUNGSZEICHEN // 
PROZEDUR ERSTELLEN t_test() 
BEGINNEN 
DECLARE EXIT HANDLER FÜR SQLEXCEPTION ROLLBACK; 
TRANSAKTION STARTEN; 
INSERT INTO tran_test VALUES('A',1); 
INSERT INTO tran_test VALUES('B',2); 
BEGEHEN; 
ENDE// 
Rufen Sie t_test() auf

Auf diese Weise werden die beiden Insert-Anweisungen tatsächlich innerhalb einer Transaktion gesteuert.

Sie können die obigen Beispiele dieses Mal testen. Wenn Sie weitere Ergänzungen und Fragen haben, können Sie sich direkt an den Herausgeber wenden. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Eine kurze Analyse von SQL-Beispielen zum Auffinden nicht festgeschriebener Transaktionen in MySQL
  • So finden Sie Informationen zu nicht festgeschriebenen Transaktionen in MySQL
  • Detaillierte Erläuterung des Lese-Commits der MySQL-Transaktionsisolationsebene
  • Untersuchung der Auswirkungen von Indizes und Commit-Häufigkeit auf die Schreibgeschwindigkeit von InnoDB-Tabellen in MySQL
  • Lösung für viele Leerzeichen, wenn PHP Textbereichsdaten an MySQL übermittelt
  • MySQL implementiert Beispiele für Transaktions-Commits und -Rollbacks
  • Python stellt eine Verbindung zu MySQL her und übermittelt ein MySQL-Transaktionsbeispiel
  • JSP + MySQL Problem mit chinesischen verstümmelten Zeichen nach der Übermittlung Lösung für verstümmelte Zeichen
  • Detaillierte Erklärung zu MySQL und Springs Autocommit

<<:  So lösen Sie das Problem, dass das Projekt in Eclipse nicht zu Tomcat hinzugefügt werden kann

>>:  Problem mit fehlgeschlagener tzselect-Einstellungszeit in Ubuntu20, Raspberry Pi-Server (empfohlen)

Artikel empfehlen

So konfigurieren Sie eine JDK-Umgebung unter Linux

1. Gehen Sie zur offiziellen Website, um das JDK-...

So verwenden Sie dl(dt,dd), ul(li), ol(li) in HTML

HTML <dl> Tag #Definition und Verwendung Da...

Beispiel für die Anpassung des Vue-Projekts an den großen Bildschirm

Eine kurze Analyse von rem Zunächst einmal ist re...

Unsere Gedanken zur Karriere als UI-Ingenieur

Ich bin seit langer Zeit depressiv, warum? Vor ein...

Erklärung zur Änderung des npm Taobao-Spiegels

1. Nutzung auf höchster Ebene 1. Installieren Sie...

So installieren Sie OpenSSH aus dem Quellcode in CentOS 7

Umgebung: Mindestinstallation von CentOS 7.1.1503...

Ausführliche Erläuterung der Standortpriorität von Nginx

Standortausdruckstyp ~ bedeutet, dass ein regulär...

Erläuterung zu JavaScript-Anti-Shake und -Throttling

Inhaltsverzeichnis Stabilisierung Drosselung Zusa...

MySQL-String-Aufteilungsvorgang (String-Abfangen mit Trennzeichen)

String-Extraktion ohne Trennzeichen Fragenanforde...