====== 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. \\ \\