MySQL-Transaktionen und Datenintegrität

MySQLMySQLBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie sich mit MySQL-Transaktionen (Transaction) befassen und deren Bedeutung für die Aufrechterhaltung der Datenintegrität verstehen. Sie werden lernen, wie Sie Transaktionen nutzen können, um sicherzustellen, dass eine Reihe von SQL-Operationen als eine einzelne Arbeitsseinheit behandelt wird, die entweder vollständig erfolgreich ist oder vollständig fehlschlägt.

Das Lab behandelt das Starten einer Transaktion mit BEGIN, das Einfügen von Daten und das Bestätigen (Commit) der Transaktion, um die Änderungen dauerhaft zu machen, das Rückgängigmachen (Rollback) eines fehlgeschlagenen Updates, um die Änderungen zu verwerfen, und die Verwendung von Savepunkten (Savepoint) für partielle Rückgänge innerhalb einer Transaktion. Sie werden sich mit einem MySQL-Server verbinden, eine Datenbank und eine Tabelle erstellen und dann diese transaktionsbezogenen Operationen üben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/use_database("Database Selection") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_database("Database Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/create_table("Table Creation") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/insert("Data Insertion") mysql/BasicKeywordsandStatementsGroup -.-> mysql/update("Data Update") subgraph Lab Skills mysql/use_database -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} mysql/create_database -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} mysql/create_table -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} mysql/select -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} mysql/insert -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} mysql/update -.-> lab-550918{{"MySQL-Transaktionen und Datenintegrität"}} end

Starten einer Transaktion mit BEGIN

In diesem Schritt werden Sie lernen, wie Sie in MySQL eine Transaktion (Transaction) mit der BEGIN-Anweisung starten. Transaktionen sind ein grundlegendes Konzept in der Datenbankverwaltung, das die Datenintegrität und -konsistenz gewährleistet. Eine Transaktion ist eine Sequenz von einer oder mehreren SQL-Operationen, die als eine einzelne Arbeitsseinheit behandelt werden. Entweder schlagen alle Operationen innerhalb der Transaktion fehl, oder alle werden erfolgreich ausgeführt.

Bevor wir uns mit dem praktischen Teil befassen, verstehen wir zunächst, warum Transaktionen wichtig sind. Stellen Sie sich vor, Sie überweisen Geld von einem Bankkonto auf ein anderes. Dies umfasst zwei Operationen: das Abheben des Betrags vom Konto des Senders und das Gutschreiben des Betrags auf das Konto des Empfängers. Wenn die erste Operation erfolgreich ist, die zweite jedoch fehlschlägt (z. B. aufgrund eines Systemausfalls), würde das Geld verloren gehen. Transaktionen verhindern solche Inkonsistenzen, indem sie sicherstellen, dass beide Operationen entweder gemeinsam erfolgreich sind oder gemeinsam fehlschlagen.

Um in MySQL eine Transaktion zu starten, verwenden Sie die BEGIN-Anweisung (oder ihr Alias START TRANSACTION). Diese Anweisung signalisiert den Beginn einer neuen Transaktion. Alle nachfolgenden SQL-Anweisungen werden Teil dieser Transaktion sein, bis Sie entweder die Änderungen COMMIT (dauerhaft machen) oder ROLLBACK (verwerfen).

Beginnen wir damit, uns mit dem MySQL-Server zu verbinden. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus:

mysql -u root -p

Sie werden nach dem Root-Passwort gefragt. Geben Sie das Passwort ein, das Sie während der MySQL-Installation festgelegt haben. Wenn Sie kein Passwort festgelegt haben, drücken Sie einfach die Eingabetaste.

Nachdem Sie sich jetzt mit dem MySQL-Server verbunden haben, erstellen wir eine Datenbank und eine Tabelle, mit denen wir arbeiten können. Führen Sie die folgenden SQL-Anweisungen aus:

CREATE DATABASE IF NOT EXISTS labex_db;
USE labex_db;
CREATE TABLE IF NOT EXISTS accounts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    account_number VARCHAR(50) NOT NULL,
    balance DECIMAL(10, 2) NOT NULL
);

Diese Befehle erstellen eine Datenbank namens labex_db und eine Tabelle namens accounts in dieser Datenbank. Die Tabelle accounts hat drei Spalten: id, account_number und balance.

Als Nächstes fügen wir einige Anfangsdaten in die Tabelle accounts ein:

INSERT INTO accounts (account_number, balance) VALUES
('ACC001', 1000.00),
('ACC002', 500.00);

Jetzt starten wir eine Transaktion. Führen Sie die folgende Anweisung aus:

BEGIN;

Dieser Befehl startet eine neue Transaktion. Alle nachfolgenden SQL-Anweisungen werden Teil dieser Transaktion sein.

Um zu überprüfen, ob die Transaktion gestartet wurde, können Sie eine einfache Update-Anweisung ausführen. Beispielsweise ziehen wir 100 von Konto 'ACC001' ab:

UPDATE accounts SET balance = balance - 100 WHERE account_number = 'ACC001';

Jetzt überprüfen wir den Kontostand von 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

Sie sollten sehen, dass der Kontostand von 'ACC001' auf 900,00 aktualisiert wurde. Diese Änderungen sind jedoch noch nicht dauerhaft. Sie sind nur innerhalb der aktuellen Transaktion sichtbar. Um die Änderungen dauerhaft zu machen, müssten Sie die Transaktion COMMIT, was Sie im nächsten Schritt lernen werden. Wenn Sie jetzt die MySQL-Verbindung schließen, ohne die Transaktion zu committen oder zurückzunehmen, würden die Änderungen verloren gehen.

Daten einfügen und die Transaktion bestätigen

Im vorherigen Schritt haben Sie gelernt, wie Sie mit der BEGIN-Anweisung eine Transaktion (Transaction) starten. Jetzt werden Sie lernen, wie Sie innerhalb einer Transaktion Daten einfügen und dann die Transaktion bestätigen (Commit), um die Änderungen dauerhaft zu machen.

Setzen Sie dort fort, wo Sie im vorherigen Schritt aufgehört haben. Sie sollten immer noch mit dem MySQL-Server verbunden sein und eine laufende Transaktion haben. Wenn nicht, verbinden Sie sich erneut mit dem MySQL-Server mit dem folgenden Befehl:

mysql -u root -p

Geben Sie bei entsprechender Aufforderung das Passwort ein und wählen Sie dann die labex_db-Datenbank aus:

USE labex_db;

Wenn Sie keine laufende Transaktion haben, starten Sie eine:

BEGIN;

Jetzt fügen wir einen neuen Datensatz in die Tabelle accounts innerhalb der aktuellen Transaktion ein:

INSERT INTO accounts (account_number, balance) VALUES ('ACC003', 200.00);

Dieser Befehl fügt ein neues Konto mit der Kontonummer 'ACC003' und einem Kontostand von 200,00 ein.

Um zu überprüfen, ob die Daten (innerhalb der Transaktion) eingefügt wurden, führen Sie die folgende Abfrage aus:

SELECT * FROM accounts WHERE account_number = 'ACC003';

Sie sollten den neu eingefügten Datensatz sehen. Wie bereits erwähnt, sind diese Änderungen jedoch noch nicht dauerhaft. Sie sind nur innerhalb der aktuellen Transaktion sichtbar.

Um die Änderungen dauerhaft zu machen, müssen Sie die Transaktion COMMIT. Die COMMIT-Anweisung speichert alle während der Transaktion vorgenommenen Änderungen in der Datenbank. Führen Sie den folgenden Befehl aus:

COMMIT;

Dieser Befehl bestätigt die Transaktion und macht die eingefügten Daten dauerhaft.

Um zu überprüfen, ob die Änderungen bestätigt wurden, führen Sie die gleiche Abfrage erneut aus:

SELECT * FROM accounts WHERE account_number = 'ACC003';

Sie sollten immer noch den neu eingefügten Datensatz sehen. Jetzt ist der Datensatz auch noch vorhanden, wenn Sie sich vom MySQL-Server trennen und erneut verbinden.

Sie können die Änderungen auch überprüfen, indem Sie alle Datensätze aus der Tabelle accounts auswählen:

SELECT * FROM accounts;

Sie sollten alle drei Konten sehen: 'ACC001', 'ACC002' und 'ACC003' mit ihren jeweiligen Kontoständen. Der Kontostand von 'ACC001' sollte 900,00 sein (wenn Sie im vorherigen Schritt die Update-Anweisung ausgeführt und nicht rückgängig gemacht haben).

Zusammenfassend hat dieser Schritt gezeigt, wie man innerhalb einer Transaktion Daten einfügt und dann die Transaktion bestätigt, um die Änderungen dauerhaft zu machen. Die COMMIT-Anweisung ist entscheidend, um sicherzustellen, dass alle Operationen innerhalb einer Transaktion in der Datenbank angewendet werden.

Rückgängig machen eines fehlgeschlagenen Updates

In diesem Schritt werden Sie lernen, wie Sie eine Transaktion (Transaction) rückgängig machen, um die während der Transaktion vorgenommenen Änderungen rückgängig zu machen. Dies ist besonders nützlich, wenn ein Fehler auftritt oder wenn Sie entscheiden, dass die innerhalb der Transaktion vorgenommenen Änderungen nicht gewünscht sind.

Setzen Sie dort fort, wo Sie im vorherigen Schritt aufgehört haben. Sie sollten immer noch mit dem MySQL-Server verbunden sein. Wenn nicht, verbinden Sie sich erneut mit dem folgenden Befehl:

mysql -u root -p

Geben Sie bei entsprechender Aufforderung das Passwort ein und wählen Sie dann die labex_db-Datenbank aus:

USE labex_db;

Jetzt starten wir eine neue Transaktion:

BEGIN;

Simulieren wir ein fehlgeschlagenes Update. Angenommen, Sie möchten 500 von 'ACC001' auf 'ACC004' überweisen, aber 'ACC004' existiert nicht. Versuchen Sie zunächst, 500 von 'ACC001' abzuziehen:

UPDATE accounts SET balance = balance - 500 WHERE account_number = 'ACC001';

Versuchen Sie nun, 500 auf 'ACC004' zu gutschreiben:

UPDATE accounts SET balance = balance + 500 WHERE account_number = 'ACC004';

Dieses Update wird wahrscheinlich keine Zeilen beeinflussen, da 'ACC004' nicht existiert. Sie können dies überprüfen, indem Sie die Anzahl der betroffenen Zeilen prüfen:

SELECT ROW_COUNT();

Das Ergebnis sollte 0 sein, was bedeutet, dass keine Zeilen aktualisiert wurden.

Da das zweite Update fehlgeschlagen ist (oder fehlgeschlagen wäre, wenn es Einschränkungen gäbe, die das Update verhindern würden), möchten Sie auch das erste Update rückgängig machen. Dazu können Sie die Transaktion ROLLBACK. Die ROLLBACK-Anweisung macht alle während der Transaktion vorgenommenen Änderungen rückgängig und bringt die Datenbank in den Zustand zurück, in dem sie sich vor Beginn der Transaktion befand.

Führen Sie den folgenden Befehl aus:

ROLLBACK;

Dieser Befehl macht die Transaktion rückgängig und hebt die Abhebung von 500 von 'ACC001' auf.

Um zu überprüfen, ob das Rückgängigmachen erfolgreich war, überprüfen Sie den Kontostand von 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

Der Kontostand von 'ACC001' sollte wieder auf seinen ursprünglichen Wert zurückgekehrt sein (1000, wenn Sie von Anfang an gestartet haben, oder 900, wenn Sie nur das erste Update in Schritt 1 bestätigt haben).

Sie können auch überprüfen, dass 'ACC003' immer noch existiert und einen Kontostand von 200,00 hat (wenn Sie Schritt 2 abgeschlossen haben).

Zusammenfassend hat dieser Schritt gezeigt, wie man eine Transaktion mit der ROLLBACK-Anweisung rückgängig macht. Dies ist unerlässlich für die Fehlerbehandlung und die Gewährleistung der Datenkonsistenz, wenn Operationen innerhalb einer Transaktion fehlschlagen.

Verwendung von Savepoints für partielle Rückgänge

In diesem Schritt lernen Sie, wie Sie Savepoints (Sicherungsmarken) innerhalb einer Transaktion nutzen können, um partielle Rückgänge (Rollbacks) durchzuführen. Savepoints sind Markierungen innerhalb einer Transaktion, zu denen Sie zurückrollen können. Dadurch können Sie effektiv nur einige der während der Transaktion vorgenommenen Änderungen rückgängig machen, anstatt die gesamte Transaktion.

Setzen Sie dort fort, wo Sie im vorherigen Schritt aufgehört haben. Sie sollten immer noch mit dem MySQL-Server verbunden sein. Wenn nicht, verbinden Sie sich erneut mit dem folgenden Befehl:

mysql -u root -p

Geben Sie bei entsprechender Aufforderung das Passwort ein und wählen Sie dann die labex_db-Datenbank aus:

USE labex_db;

Jetzt starten wir eine neue Transaktion:

BEGIN;

Zunächst erstellen wir einen Savepoint namens savepoint1:

SAVEPOINT savepoint1;

Dieser Befehl erstellt einen Savepoint namens savepoint1. Alle Änderungen, die nach diesem Savepoint vorgenommen werden, können auf diesen Punkt zurückgerollt werden.

Jetzt aktualisieren wir den Kontostand von 'ACC001':

UPDATE accounts SET balance = balance - 200 WHERE account_number = 'ACC001';

Als Nächstes erstellen wir einen weiteren Savepoint namens savepoint2:

SAVEPOINT savepoint2;

Jetzt fügen wir einen neuen Datensatz in die Tabelle accounts ein:

INSERT INTO accounts (account_number, balance) VALUES ('ACC004', 300.00);

Angenommen, Sie entscheiden sich nun dafür, die Einfügung von 'ACC004' rückgängig zu machen, aber die Aktualisierung von 'ACC001' beizubehalten. Sie können auf savepoint2 zurückrollen:

ROLLBACK TO savepoint2;

Dieser Befehl rollt die Transaktion auf den Zustand zurück, in dem sie sich befand, als savepoint2 erstellt wurde, und macht effektiv die Einfügung von 'ACC004' rückgängig.

Um zu überprüfen, ob das Zurückrollen auf savepoint2 erfolgreich war, prüfen Sie, ob 'ACC004' existiert:

SELECT * FROM accounts WHERE account_number = 'ACC004';

Diese Abfrage sollte keine Zeilen zurückgeben, was bedeutet, dass 'ACC004' entfernt wurde.

Jetzt überprüfen wir den Kontostand von 'ACC001':

SELECT * FROM accounts WHERE account_number = 'ACC001';

Der Kontostand von 'ACC001' sollte aktualisiert sein (um 200 verringert).

Wenn Sie mit den verbleibenden Änderungen (der Aktualisierung von 'ACC001') zufrieden sind, können Sie nun die Transaktion bestätigen:

COMMIT;

Dieser Befehl bestätigt die Transaktion und macht die Aktualisierung von 'ACC001' dauerhaft.

Zusammenfassend hat dieser Schritt gezeigt, wie man Savepoints innerhalb einer Transaktion verwendet, um partielle Rückgänge durchzuführen. Dies bietet eine feinere Kontrolle über die Transaktionsverwaltung und ermöglicht es Ihnen, bestimmte Änderungen rückgängig zu machen, während andere beibehalten werden.

Zusammenfassung

In diesem Lab haben Sie die Grundlagen von MySQL-Transaktionen (Transaktionen in MySQL) und deren Bedeutung für die Aufrechterhaltung der Datenintegrität gelernt. Das Lab begann damit, zu zeigen, wie man eine Transaktion mit der BEGIN-Anweisung (oder START TRANSACTION) startet. Anschließend haben Sie eine Datenbank namens labex_db und eine Tabelle accounts darin erstellt, um sich auf nachfolgende Transaktionsoperationen vorzubereiten.

Die ersten Schritte konzentrierten sich auf die Einrichtung der Umgebung und das Verständnis der grundlegenden Syntax zum Starten einer Transaktion. Dies bildete die Grundlage für die Erkundung der COMMIT- und ROLLBACK-Operationen in späteren Schritten zur Verwaltung von Datenänderungen innerhalb einer Transaktion.