# Begin transaction - rollback, commit...?



## ruutaiokwu (14. Mrz 2014)

hallo zusammen

es geht um sql server und transaktionen.

im netz sieht man immer wieder beispiele mit diesen befehlen, und zwar immer in dieser art

*


		SQL:In die Zwischenablage kopieren


BEGIN TRANSATION
...
...
...
ROLLBACK TRANSACTION

*


*


		SQL:In die Zwischenablage kopieren


BEGIN TRANSACTION
...
...
...
COMMIT TRANSACTION

*


...mir ist klar, dass die anweisung "BEGIN TRANSATION" immer verwendet werden muss. allerdings ist mir nicht klar, wie bspw. "COMMIT TRANSACTION" verwendet werden muss.

ist es fakt, dass bei meinem beispiel mit "COMMIT TRANSACTION" alle instruktionen dazwischen ('...') nur ausgeführt werden wenn keine einzige anweisung davon fehlschlägt? wenn ja: für was braucht es denn überhaupt einen ROLLBACK-befehl? ist der dafür da um die transaktion rückgängig zu machen, wenn diese NICHT fehlgeschlagen ist? (=alle teilschritte ausgeführt)

und wie ist es in meinem beispiel mit "ROLLBACK TRANSACTION"? dort gibt es kein explizites commit. wie kann das gehen? (man sieht ständig die beiden beispiele von mir im netz, jedoch praktisch nix was alle 3 befehle verwendet: BEGIN, COMMIT & ROLLBACK...

ich möchte mich jetzt nicht auf mehrschichtige transaktionen beziehen, eine erklärung mit einem hello-world-beispiel wäre hilfreich! vielen dank!


----------



## fischefr (15. Mrz 2014)

Hallo!
Fangen wir mal mit den Grundlagen an:
Datenbanktransaktionen sind atomar d.h. entweder werden alle Änderungen innerhalb einer Transaktion (BEGIN bis COMMIT oder ROLLBACK) ausgeführt oder gar keine. Stell dir vor, du bist in der Bank und willst Geld von einem Konto auf ein anderes überweisen. Dann passieren da folgende Schritte:

BEGIN
1. Lies Guthaben vom eigenen Konto
2. Setze neues Guthaben eigenes Konto = gelesener Wert - zu überweisenden Betrag
3. Lies Guthaben vom Empfängerkonto
4. Setze neues Guthaben Empfängerkonto = gelesener Wert + zu überweisender Betrag
COMMIT

Soweit zum Normalfall. Jetzt stell dir vor, nach Schritt 2 fällt der Strom aus. Wären Datenbanktransaktioenn nicht atomar (was sie aber sind), würde plötzlich in der Bilanz der Bank Geld verloren gehen.
Tritt der Stromausfall tatsächlich auf, wird die Datenbank automatisch einen ROLLBACK beim Neustart des Datenbankserver ausführen. Du benutzt also ROLLBACK, wenn du die Anweisungen seit dem letzten BEGIN ungeschehen machen möchtest. Um die Transaktion abzuschließen und das Ergebnis dauerhaft zu speichern, verwendest du COMMIT. Wenn du nichts von beiden benutzt, wird die Datenbank nach einem Timeout selbst ein ROLLBACK durchführen. Ist aber nicht zu empfehlen.

Interne Arbeitsweisen:
Während der Transaktion führt die Datenbank intern protokoll, was du in der Transaktion so treibst. Beim Commit wird diese Mitschrift gelöscht, beim Rollback rückwärts abgearbeitet und rückgängig gemacht. Jede Anweisung wird also SOFORT ausgeführt und nicht erst beim commit. Stattdessen wird sie im Fehlerfall rückabgewickelt.
Dann gibt es da noch das Thema isolation level: Üblicherweise ist es so, dass du Änderungen die noch nicht commited sind innerhalb einer weiteren Transaktion die parallel zur 1. Transaktion benutzt wird nicht sehen kannst. Es sieht dann für die 2. Transaktion so aus, als gäbe es die 1. gar nicht. Dieses Verhalten (Stichwort "isolation level") kann aber per Konfiguration geändert werden (was aber meist keine gute Idee ist)


----------



## ruutaiokwu (16. Mrz 2014)

hallo fischefr

vielen dank für deine kompetente antwort!


----------

