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:
|
<<: So lösen Sie das Problem, dass das Projekt in Eclipse nicht zu Tomcat hinzugefügt werden kann
Der zu erzielende Effekt ist: Festes Vergrößern a...
In MySQL können in der Datenbank fehlerhafte Zeic...
1. Gesamtarchitekturdiagramm Im Vergleich zu ande...
Kommentare und Nachrichten waren ursprünglich ein...
Die MySQL Master-Slave-Replikation ermöglicht die...
1. Installieren Sie das Fcitx-Eingabeframework Zu...
Inhaltsverzeichnis Vorwort Umfang 1. Was ist Umfa...
(I) Methode 1: Vorab direkt im Skript-Tag definie...
Original-URL: http://segmentfault.com/blog/ciaocc/...
Konventionelle Lösung Verwenden Sie FileReader, u...
Inhaltsverzeichnis 1. V8-Quelle 2. V8-Serviceziel...
1. Entpacken Sie die heruntergeladene Datei wie u...
CHAR- und VARCHAR-Typen sind ähnlich und untersch...
Inhaltsverzeichnis 【Wirkung】 【Implementierungsmet...
1. Installation von Docker unter CentOS8 curl htt...