SQL MYSQL InnoDB "ROLLBACK" funktioniert nicht bei Transaktion

raven16

Lieutenant
Dabei seit
Nov. 2008
Beiträge
580
Hallo,

ich möchte in MYSQL (InnoDB) einige DELETE Befehle in einer Transaktion laufen lassen, auch weil mir ein Delete-Join über 6 Tabellen viel zu kompliziert ist. :D

Probiert habe ich in phpMyAdmin folgende Transaktion
Code:
SET autocommit=0;
START TRANSACTION;
	DELETE FROM benutzer WHERE mandantenNr=98765432;
	DELETE FROM gruppe WHERE FirmaID=98765432;
	DELETE FROM fahrer WHERE FirmaID=98765432;
	DELETE FROM firma WHERE FirmaID=98765432;
	DELETE FROM adresse WHERE AdressID=25;
COMMIT;
Mit dem Abschicken des COMMIT; Befehls werden alle nötigen Datensätze gelöscht, was soweit ganz gut ist.
Jedoch bewirkt ein Absetzen von ROLLBACK; danach nicht, dass die vorher gelöschten Datensätze wiederhergestellt werden. Am Ende würde ich natürlich autocommit wieder auf 1 setzen.

Wenn ich den COMMIT noch nicht ausführe, dann werden die Daten in den Tabellen noch angezeigt.

Was mache nicht oder was mache ich falsch?

Gruß
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
41.577
Nach einem Commit ist kein Rollback mehr möglich... der dient nur dazu innerhalb der Transaktion (also vor dem Commit) abbrechen zu können und alle vorherigen Aktionen rückgängig zu machen. Mit dem Commit schließt du die Transaktion aber ab, ab da ist alles persistent.
 

raven16

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2008
Beiträge
580
Achso, ja sowas dachte ich mir schon...
Aber wie kann ich dann prüfen, ob alle Befehle, die ich vor dem COMMIT absetze, erfolgreich waren? Bevor ich COMMIT nicht absetze, verschwinden die gewünschten Datensätze auch nicht in der Anzeige-Ansicht von phpMyAdmin.

Okay später würde ich dies so oder so in PHP umsetzen, da interessiert mich ja die Anzeige von phpMyAdmin nicht.
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
41.577
Die Ergebnisse der Befehle einer Transaktion sind vor dem Commit nur innerhalb dieser sichtbar. Ich weiß jetzt nicht wie gut das innerhalb von phpMyAdmin klappt aber sets mal einen Select mit in die Transaktion rein, dann solltest du sehen was ich meine.
 

raven16

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2008
Beiträge
580
Danke, das war sehr aufschlussreich. (Siehe Zeile 8)
Code:
SET autocommit=0;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
START TRANSACTION;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
DELETE FROM benutzer WHERE mandantenNr=98765432;# 1 Datensatz betroffen.
DELETE FROM gruppe WHERE FirmaID=98765432;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
DELETE FROM fahrer WHERE FirmaID=98765432;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
DELETE FROM firma WHERE FirmaID=98765432;# 1 Datensatz betroffen.
DELETE FROM adresse WHERE AdressID=27;# 1 Datensatz betroffen.
SELECT * FROM firma WHERE FirmaID=98765432;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
COMMIT;# MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze).
Gruppe und Fahrer war nichts drin, daher leeres Resultat.
Ist es normal, dass autocommit kein Resultat zurück liefert?

Ansonsten komme ich glaub ich erst einmal zurecht :) Danke
 

Jesterfox

Fleet Admiral
Dabei seit
März 2009
Beiträge
41.577
Mit den Spezialitäten von MySQL und dessen autocommit kenn ich mich nicht so aus... ich hab mehr mit MSSQL zu tun ;-) aber manche Sachen sind überall gleich.

PS: wobei bei einer explizit gestarteten Transaktion das autocommit keinen Einfluss haben sollte, das ist normalerweise nur für den interaktiven Modus wenn man einzelne statements absetzt (bin mir aber bei MySQL wie gesagt nicht sicher)
 

raven16

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2008
Beiträge
580
Bin bei Google bzgl. autocommit noch bei folgendem
Buch gelandet.

Daher hatte ich das zur Sicherheit verwendet. Schadet ja nicht, solange es nach dem Commit wieder eingeschaltet wird.
 
Top