Seitenleiste

Community

SQL

Grundlagen

Datenbanksysteme

Client/Server

Eingebettet

Transaktionen (SQL Transact)

Eine Transaction ist eine Zusammenfassung von Datenbankänderungen zu einer Arbeitseinheit.
Wenn alle in einer Transaktion durchgeführten Datenänderungen erfolgreich sind, können diese durch ein Commit ausgeführt werden. Erst durch dieses Commit werden die Datenbankänderungen dauerhaft in der Datenbank gespeichert. Treten dagegen Fehler bei der Verarbeitung der Datenbankänderung auf, können diese Änderungen am Datenbestand durch ein Rollback wieder Rückgängig gemacht werden.

Jede Transaktion startet mit einer BEGIN TRANSACTION Anweisung, die (in diesem Beispiel bei Nutzung der MS SQL Express) von Microsoft Distributed Transaction Coordinator (MS DTC) verwaltet wird.

BEGIN DISTRIBUTED TRANSACTION TransactionName


Nach der Begin Anweisung folgen die Datenbankänderungen und den Schluss bildet dann die Anweisung

COMMIT TRANSACTION TransactionName


oder wenn ein Fehler bei der Verarbeitung der Datenbankänderung aufgetreten ist

ROLLBACK TRANSACTION TransactionName


um die Datenbank wieder in den Zustand vor der Datenbankänderung , also vor Beginn der Transaction, zurück zu setzen.

Beispiel

(Das Beispiel bezieht sich auf MS SQL Express)

In diesem Beispiel wird in die Tabelle Tab_A, in die Spalte IntFeld_TabA der Wert 1 zugefuegt, die neu erzeugte ID aus Tab_A ermittelt und diese ID aus Tab_A dann in die Tab_B geschrieben.

BEGIN DISTRIBUTED TRANSACTION ExampleTrans;
DECLARE @NewId int;
INSERT INTO Tab_A (IntFeld_TabA) VALUES (1);
SET @NewId =  (SELECT @@identity AS id);
UPDATE Tab_B SET IntFeld_TabB = @NewId WHERE TabB_ID = 1;
COMMIT TRANSACTION ExampleTrans;


Für den Fall, dass der erste Insert zwar einwandfrei durchgeführt werden konnte, aber aus verschiedenen Gründen ein falscher Wert in Tab_B eingetragen würde (falsche oder ungültige neue ID), kann die Transaktion aber auch mit einem ROLLBACK beendet werden. In diesem Fall würde der erste Insert Rückgängig gemacht und die Tab_A würde wieder den Stand vor der Transaktion annehmen.

BEGIN DISTRIBUTET TRANSACTION ExampleTrans;
DECLARE @NewId int;
INSERT INTO Tab_A (IntFeld_TabA) VALUES (1);
SET @NewId =  (SELECT @@identity AS id);
UPDATE Tab_B SET IntFeld_TabB = @NewId WHERE TabB_ID = 1;
ROLLBACK TRANSAKTION ExampleTrans;



Vorteile

Es wird Sichergestellt, dass die Abfolge von einzelnen Datenbankanweisungen als ein untrennbares Paket betrachtet wird. Nur wenn alle Anweisungen erfolgreich durchgeführt werden können, werden die Datenbankeinträge verändert und wenn eine Anweisung fehlschlägt, kann die komplette Transaction wieder Rückgängig gemacht werden.
Es dürfen mehrere Transaction mit Namen benannt werden, die unabhängig von einander, auch verschachtelt, durchgeführt werden können. Solange kein COMMIT oder ROLLBACK gesendet wird, pausieren vorhergehende Transaction.

Nachteile

Auch bei Transaction werden bei INSERT neue ID’s vergeben. Somit können bei autoincrement auch bei einem ROLLBACK Lücken in den ID’s entstehen.
Werden mehrere Transaction durchgeführt, so werden diese der Reihe nach im Speicher gehalten und die Tabellen blockiert, bis das entsprechende COMMIT oder ROLLBACK aufgerufen wird.