Einführung in SQL: TCL - Ablaufsteuerung
Aus Wikibooks
Dieses Kapitel gibt eine kurze Einführung in die Transaction Control Language (TCL). Deren Befehle sorgen für die Datensicherheit innerhalb einer Datenbank.
MySql verfolgt eine etwas "offenere" Philosophie und arbeitet anstelle von Transaktionen auch mit anderen Sicherungsmaßnahmen. Der Ersteller einer Datenbank muss sich für ein Verfahren entscheiden, kann aber auch danach noch variieren.
Inhaltsverzeichnis |
[Bearbeiten] Beispiele
Eine SQL-Datenbank speichert Daten in der Regel in verschiedenen Tabellen. Dabei ist es nötig, dass die betreffenden Befehle immer "gleichzeitig" ausgeführt werden. Da das nicht möglich ist – zwei Befehle können nur nacheinander erledigt werden –, muss sichergestellt sein, dass nicht der eine Befehl ausgeführt wird, während der andere Befehl scheitert.
- Zu einer Überweisung bei der Bank gehören immer zwei Buchungen: die Gutschrift auf dem einen und die Lastschrift auf dem anderen Konto; häufig gehören die Konten zu verschiedenen Banken. Es wäre völlig unerträglich, wenn die Gutschrift ausgeführt würde und die (externe) Lastschrift nicht, weil in diesem Moment die Datenleitung unterbrochen wird.
- Wenn in dem Versicherungsunternehmen der Beispieldatenbank ein neuer Vertrag abgeschlossen wird, gehören dazu mehrere INSERT-Befehle, und zwar in die Tabellen Fahrzeug, Versicherungsnehmer, Versicherungsvertrag. Zuerst müssen Fahrzeug und Versicherungsnehmer gespeichert werden; aber wenn das Speichern des Vertrags "schiefgeht", hängen die beiden anderen Datensätze nutzlos in der Datenbank herum.
- Wenn dort eine Abteilung ausgelagert wird, werden alle ihre Mitarbeiter gestrichen, weil sie nicht mehr zum Unternehmen gehören. Wie soll verfahren werden, wenn nur ein Teil der DELETE-Befehle erfolgreich war?
Solche Probleme können nicht nur durch die Hardware entstehen, sondern auch dadurch, dass parallel andere Nutzer denselben Datenbestand ändern wollen.
[Bearbeiten] Transaktionen
Alle solche Ungereimtheiten werden vermieden, indem SQL-Befehle in Transaktionen zusammengefasst und ausgeführt werden:
- Entweder alle Befehle können ausgeführt werden. Dann wird die Transaktion bestätigt und erfolgreich abgeschlossen.
- Oder (mindestens) ein Befehl kann nicht ausgeführt werden. Dann wird die Transaktion für ungültig erklärt; alle Befehle werden rückgängig gemacht.
Es gibt verschiedene Arten von Transaktionen. Diese hängen vom DBMS und dessen Version, der Hardware (Einzel- oder Mehrplatzsystem) und dem Datenzugriff (direkt oder über Anwenderprogramme) ab.
- Wenn die Datenbank auf AUTOCOMMIT eingestellt ist, wird jeder SQL-Befehl als einzelne Transaktion behandelt und sofort gültig.
- Wenn ein Stapel von Befehlen mit COMMIT bestätigt oder mit ROLLBACK verworfen wird, dann wird mit dem nächsten Befehl implizit eine neue Transaktion begonnen.
- Mit einem ausdrücklichen TRANSACTION-Befehl wird explizit eine neue Transaktion begonnen:
BEGIN TRANSACTION <Name>; /* bei MS-SQL */ SET TRANSACTION <Name>; /* bei Firebird */ START TRANSACTION; /* bei My-SQL */
Eine Transaktion kann mit einem Namen versehen werden. Dies ist vor allem dann nützlich, wenn Transaktionen geschachtelt werden. Außerdem gibt es je nach DBMS noch viele weitere Optionen, mit denen eine Transaktion detailliert gesteuert werden kann.
- Eine Transaktion, die implizit oder explizit begonnen wird, ist ausdrücklich abzuschließen durch COMMIT oder ROLLBACK. Wenn dies vergessen wird, wird die Transaktion erst dadurch beendet, dass die Verbindung mit der Datenbank geschlossen wird.
[Bearbeiten] Transaktion erfolgreich beenden
Eine Transaktion wird mit einem der folgenden Befehle erfolgreich abgeschlossen:
COMMIT [ TRANSACTION | WORK ] <Name>;
Die genaue Schreibweise und Varianten müssen in der DBMS-Dokumentation nachgelesen werden.
Dieser Befehl bestätigt alle vorangegangenen Befehle einer Transaktion und sorgt dafür, dass sie "am Stück" gespeichert werden.
Beispiel aus dem Firebird-Skript zum Erstellen der Beispieldatenbank:
COMMIT; /* damit wird die vorherige Transaktion abgeschlossen und implizit eine neue Transaktion gestartet */ INSERT INTO Dienstwagen (Kennzeichen, Farbe, Fahrzeugtyp_ID, Mitarbeiter_ID) VALUES ('DO-WB 111', 'elfenbein', 16, NULL); INSERT INTO Dienstwagen (Kennzeichen, Farbe, Fahrzeugtyp_ID, Mitarbeiter_ID) SELECT 'DO-WB 3' || Abteilung_ID || SUBSTRING(Personalnummer FROM 5 FOR 1), 'gelb', SUBSTRING(Personalnummer FROM 5 FOR 1), ID FROM Mitarbeiter WHERE Abteilung_ID IN (5, 8) AND Ist_Leiter = 'N'; /* damit wird diese Transaktion abgeschlossen */ COMMIT;
[Bearbeiten] Sicherungspunkte
Mit dem folgenden Befehl kann eine Transaktion in "sichere" Abschnitte geteilt werden:
SAVEPOINT <Name>;
Bis zu diesem Sicherungspunkt werden die Befehle auch dann als gültig abgeschlossen, wenn die Transaktion am Ende für ungültig erklärt wird.
[Bearbeiten] Transaktion rückgängig machen
Eine Transaktion wird wie folgt für ungültig erklärt:
ROLLBACK [ TRANSACTION | WORK ] <Name> [ TO <Sicherungspunkt> ] ;
Damit werden alle Befehle der Transaktion für ungültig erklärt und rückgängig gemacht. Sofern ein Sicherungspunkt angegeben ist, werden die Befehle bis zu diesem Sicherungspunkt für gültig erklärt und erst alle folgenden für ungültig.
Die genaue Schreibweise und Varianten müssen in der DBMS-Dokumentation nachgelesen werden.
Mit dem folgenden Beispiel werden zu Testzwecken einige Daten geändert und abgerufen; abschließend werden die Änderungen rückgängig gemacht.
UPDATE Dienstwagen SET Farbe = 'goldgelb/violett gestreift' WHERE ID >= 14; SELECT * FROM Dienstwagen; ROLLBACK;
[Bearbeiten] Zusammenfassung
In diesem Kapitel lernten Sie die Grundbegriffe von Transaktionen kennen:
- Eine Transaktion wird implizit oder explizit begonnen.
- Eine Transaktion wird mit einem ausdrücklichen Befehl (oder durch Ende der Verbindung) abgeschlossen.
- Mit COMMIT wird eine Transaktion erfolgreich abgeschlossen; die Daten werden abschließend gespeichert.
- Mit ROLLBACK werden die Änderungen verworfen, ggf. ab einem bestimmten SAVEPOINT.