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

Vue3.0 Handschrift-Lupeneffekt

Der zu erzielende Effekt ist: Festes Vergrößern a...

So gehen Sie mit verstümmelten Zeichen in der MySQL-Datenbank um

In MySQL können in der Datenbank fehlerhafte Zeic...

Detaillierte Erläuterung der logischen Architektur von MySQL

1. Gesamtarchitekturdiagramm Im Vergleich zu ande...

So konfigurieren Sie die MySQL Master-Slave-Replikation unter Windows

Die MySQL Master-Slave-Replikation ermöglicht die...

So verwenden Sie js, um festzustellen, ob eine Datei UTF-8-codiert ist

Konventionelle Lösung Verwenden Sie FileReader, u...

Detaillierte Erläuterung des Ausführungsprozesses der JavaScript-Engine V8

Inhaltsverzeichnis 1. V8-Quelle 2. V8-Serviceziel...

MySql 8.0.16-win64 Installations-Tutorial

1. Entpacken Sie die heruntergeladene Datei wie u...

Der Unterschied zwischen char und varchar in MySQL

CHAR- und VARCHAR-Typen sind ähnlich und untersch...

Beispiel für die Implementierung einer Komponente mit fester Unterseite in Vue

Inhaltsverzeichnis 【Wirkung】 【Implementierungsmet...

Detaillierte Erklärung der Docker-Nutzung unter CentOS8

1. Installation von Docker unter CentOS8 curl htt...