Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Umgang mit Transaktionen in MySQL

MySQL stellt verschiedene Datenbank-Engines bereit, um die SQL-Abfragen zu verarbeiten. Die beliebtesten Engines sind MyISAM und InnoDB. Von diesen beiden Engines unterstützt InnoDB Transaktionen, was bedeutet, dass wir Commit und Rollback durchführen können, um eine Operation auszuführen, die mehrere Abfragen als eine Einheit umfasst. Dasselbe ist mit MyISAM nicht möglich, da es keine Transaktionen unterstützt. InnoDB ist im Vergleich zu MyISAM zuverlässiger, da es Transaktionsprotokolle für die automatische Wiederherstellung verwendet.

Notizen :MySQL plant, MyISAM vollständig zu entfernen, da InnoDB im Vergleich zu MyISAM viel leistungsfähiger ist.

Dieses Tutorial enthält die Details zur Handhabung von Transaktionen in MySQL mit START TRANSACTION, COMMIT und ROLLBACK Aussagen. Obwohl wir die SQL-Abfragen separat ausführen können, was das ideale Szenario ist, müssen wir in einigen Fällen sicherstellen, dass alle für eine Aufgabe spezifischen Abfragen entweder erfolgreich sein oder fehlschlagen müssen, da eine der Abfragen fehlschlägt. Wir können solche Aufgaben als eine einzelne Einheit betrachten, die mehrere Operationen oder Abfragen zum Erstellen, Aktualisieren oder Löschen von Zeilen umfasst. Daher muss eine Transaktionseinheit mit mehreren Operationen entweder erfolgreich sein oder fehlschlagen.

Beim Umgang mit Transaktionen ist Vorsicht geboten, da bestimmte Anweisungen nicht rückgängig gemacht werden können. Dazu gehören CREATE/DROP-Datenbank, CREATE/ALTER/DROP-Tabelle oder gespeicherte Routinen.

Eigenschaften einer Transaktion

Nachfolgend sind die vier Standardeigenschaften einer Transaktion aufgeführt. Diese werden auch als ACID bezeichnet .

Atomizität - Es stellt sicher, dass alle an einer Aufgabe oder Einheit beteiligten Operationen erfolgreich abgeschlossen werden. Falls einer der Vorgänge fehlschlägt, muss die Transaktion abgebrochen werden und alle vorherigen Vorgänge müssen auf ihren früheren Zustand zurückgesetzt werden. Das bedeutet, dass im Falle des Scheiterns einer Transaktion keine der daran beteiligten Operationen erfolgreich sein muss.

Konsistenz - Die Daten müssen sich zu Beginn und am Ende der Transaktion in einem konsistenten Zustand befinden, um sicherzustellen, dass die Datenbank den Status ändert, um die Änderungen nach einer erfolgreich festgeschriebenen Transaktion widerzuspiegeln.

Isolierung - Die Transaktion muss isoliert abgeschlossen werden, wobei die Zwischenzustände mit anderen Transaktionen verborgen werden. Jede Transaktion muss unabhängig und füreinander transparent sein.

Haltbarkeit - Es stellt sicher, dass die Datenänderungen im Rahmen einer Transaktion auch bei einem Systemausfall bestehen bleiben. Die Änderungen dürfen auch bei einem Systemausfall nicht rückgängig gemacht werden.

Transaktionsaufstellungen

TRANSAKTION STARTEN - Wir können START TRANSACTION verwenden oder BEGINNEN oder BEGINN DER ARBEIT um die Transaktion zu starten. Der BEGINN oder BEGINN DER ARBEIT sind die Aliase von START TRANSACTION.

VERPFLICHTEN - Im Erfolgsfall das COMMIT Der Befehl muss am Ende der Transaktion ausgegeben werden, um die Änderungen beizubehalten.

ROLLBACK - Im Falle eines Fehlers das ROLLBACK Befehl muss ausgegeben werden, um die Zustände wie vor dem Start der Transaktion wiederherzustellen.

AUTOCOMMIT EINSTELLEN - Verwenden Sie die Anweisung SET AUTOCOMMIT Auto-Commit zu Beginn der Transaktion zu deaktivieren und am Ende der Transaktion zu aktivieren. Nur verwenden, wenn TRANSAKTION STARTEN oder BEGINNEN oder BEGINN DER ARBEIT werden nicht zur Abwicklung der Transaktion verwendet.

Beispiel einer Geldüberweisung

Ich werde die Transaktion anhand des Beispiels einer bankinternen Geldüberweisung erläutern, bei der ein bestimmter Geldbetrag von einem Konto auf ein anderes Konto innerhalb derselben Bank überwiesen werden muss.

Notizen :Dieses Beispiel dient nur zu Demonstrationszwecken und das tatsächliche Szenario wird aufgrund der Bankregeln definitiv anders sein. Es wird auch davon ausgegangen, dass die Transaktionsabfragen programmatisch behandelt werden und die Zwischenwerte in geeigneten Variablen gespeichert werden.

Die Reihenfolge der Operationen zur Durchführung der Übertragung ist wie folgt:

  • Beziehen Sie die Soll- und Haben-Kunden-IDs aus der Anfrage und speichern Sie sie in Variablen.
  • Beziehen Sie den zu überweisenden Betrag aus der Anfrage und speichern Sie ihn in einer Variablen.
  • Starten Sie die Transaktion.
  • Beziehen Sie das Guthaben des ersten Kunden und speichern Sie es in einer Variablen.
  • Beziehen Sie das Guthaben des zweiten Kunden und speichern Sie es in einer Variablen.
  • Rollback der Transaktion, falls der erste Kunde nicht genügend Guthaben hat.
  • Fügen Sie eine Belastungsbuchung hinzu, um den Abzug vom ersten Kundenkonto widerzuspiegeln.
  • Rollback im Fehlerfall.
  • Fügen Sie eine Guthabentransaktion hinzu, um die Überweisung auf das zweite Kundenkonto widerzuspiegeln.
  • Rollback im Fehlerfall.
  • Überweisung aufzeichnen.
  • Rollback im Fehlerfall.
  • Aktualisieren Sie das Guthaben des ersten Kunden.
  • Rollback im Fehlerfall.
  • Aktualisieren Sie das Guthaben des zweiten Kunden.
  • Rollback im Fehlerfall.
  • Übernehmen Sie die Transaktion.

Nachfolgend sind die Beispielabfragen zum Ausführen der Übertragungssequenz aufgeführt.

-- Start the transaction
START TRANSACTION;

-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;

-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;

-- Rollback in case of insufficient funds
ROLLBACK;

-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);

-- Rollback in case of failure
ROLLBACK;

-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);

-- Rollback in case of failure
ROLLBACK;

-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;

-- Rollback in case of failure
ROLLBACK;

-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;

-- Rollback in case of failure
ROLLBACK;

-- Commit the transaction
COMMIT;

Wir können deutlich sehen, dass wir im Falle eines Fehlers in irgendeiner Phase einen Rollback durchführen müssen, um zu den ursprünglichen Zuständen zurückzukehren, bevor wir mit der Übertragung beginnen, um das tatsächliche Guthaben beider Kunden widerzuspiegeln.

So können wir die Transaktionen in MySQL handhaben.