Automatisches Rollback
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anweisung
brauche
code
duplikat
fehler
http
kontrollieren
leben
machen
marke
sagen
schema
senden
set
spalte
suche
tabelle
transaktion
update
url
-
Ich habe einige InnoDB Tabellen, an denen ich einige UPDATE, INSERT Anweisungen ausführe, dies möchte ich als Transaktion machen.
Das Problem ist, dass ich einen automatischen ROLLBACK brauche, sobad eine INSERT Anweisung (z.B. aufgrund eines Dublikat in einer Unique Spalte). Gerade ist es so, dass alle Befehle, außer diesem mit dem Dublikat werden fehlerfrei ausgeführt.
Sollte eine Transatkion nicht atomar sein, also alles oder nichts?
Oder habe ich da einen Verständnisfehler? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ich weiß zwar nicht genau was Du meinst aber atomar heißt so viel wie unzerteilt, nicht aufgeteilt
zu dem anderen was Du geschrieben hast in einer unique Spalte dürfen keine duplikate vorhaden sein wenn Du die Spalte auf unique setzten willst muss erst das duplikat entfernt werden
wenn man etwas eintragen will was schon in der Spalte steht muss das alte erst entwernt werden ich würde Dir aber bei Transaktionen eine extra Tabelle empfehlen wo alle Transaktionen gespeichert werden ob sie noch gebraucht werden oder nicht und das einzige das da unique sein solle wäre dann die id
so geht auch nie eine Transaktion verloren
wenn ich Dir nicht weiter geholfen habe mit der Antwort dann habe ich nicht verstanden was Du eigentlich willst -
In de transaktion wird unter anderem ein INSERT in eine Tabelle gemacht, die eine unique Spalte enthält.
Wenn dieser INSERT aufgrund der unique Spalte fehlschlägt soll ein ROLLBACK gemacht werden.
Gerade ist es so, dass alle anweisungen, bis auf diesen INSERT aufgeführt werden.
Und das ist ja leider nicht atomar, unzerteilbar oder wie auch immer. -
unlikus schrieb:
genau das macht unter dem link, was ich geschickt habe, 'ROLLBACK TO SAVEPOINT'. du definierst irgendwo eine 'quasi-marke' (SAVEPOINT) und wenn etwas schief geht hast automatisch dein ROLLBACK bis dorthin. am ende irgendwo musst du die marke 'löschen'.
... Suche aber eigenltich nach einer Lösung, dass mysql die transaktion selbst abbricht, wenn was schief läuft.
also ob etwas schief gegangen ist oder nicht, das kann dir mysql ganz ohne deine hilfe nicht wissen/entscheiden. -
natürlich könnte ich in php immer kontrollieren was schiefläuft und dann ein ROLLBACK senden.
Mit geht es um eine Möglchkeit mysql sagen, was als fehler gilt (dublikate, fehlerhafte Query und so weiter), damit es dann den ROLLBACK macht. Wenn es diese Möglcihkeit nicht gibt, werde ich wohl damit leben müssen.
Aslo im Vorhinein zu sagen, was als Fehler gilt, in den conf oder so.
Beitrag zuletzt geändert: 18.8.2013 11:51:46 von unlikus -
unlikus schrieb:
all das was du vor hast, ist mit einem enzigen query nicht zu schaffen.
natürlich könnte ich in php immer kontrollieren was schiefläuft und dann ein ROLLBACK senden.
Mit geht es um eine Möglchkeit mysql sagen, was als fehler gilt (dublikate, fehlerhafte Query und so weiter), damit es dann den ROLLBACK macht. Wenn es diese Möglcihkeit nicht gibt, werde ich wohl damit leben müssen.
Aslo im Vorhinein zu sagen, was als Fehler gilt, in den conf oder so.
z.b. für 'duplicate key' gibt es die lösung (natürlich nur ein beispiel):INSERT INTO ds_product SET pID=3112, catID=231, uniCost=232.50, salePrice=250.23, ON DUPLICATE KEY UPDATE uniCost=232.50, salePrice=250.23;
also DU musst die query so gestalten, dass es automatisch so geht!
gegen fehlerhafen querie kannst du EXPLANE/DESCRIBE (<-click) einsetzen.
ich kann dir leider hier nicht mehr weiter helfen, ohne dass du die creates deiner tabellen veröffentlichst und eine etwas genauere beschreibung zu dem programm gibst. -
an sich möchte ich nur ein Art try catch machen, dies gibt in mysql wohl leider nicht. Und ich möchte nicht in php jeden Query auf Erfolg prüfen und dann ein ROLLBACK senden.
Es geht ja nicht darum im speziellen einen Dublik error abzufangen, sondern allgemein alle Fehler, die auftreten können.
Wenn alles richtig läuft, sollte auch kein Dublikat enstehen, da ich in der gleichen transaktion vorher prüfe, ob es einen geben könnte. -
und warum muss das unbedingt die Datenbank machen?
das habe ich jetzt nicht so ganz verstanden falls Du nur nicht zu viele try catch Blöcke in deinem code haben willst kannst auch eine Funktion dafür schreiben oder/und es mit einer schleife durch laufen
ansonsten kenneich nur bei SQL try catch aber nicht bei mysql -
also mein letzter versuch zu zeigen wie es in mysql geht (nicht aber ganz ohne php!):
pseudocodeSTART TRANSACTION; LOCK TABLES <table> WRITE; SAVEPOINT <name>; INSERT DATA ... SET ... ON DUPLICATE KEY UPDATE ...; if('etwas nicht gut' [via php]) { ROLLBACK TO SAVEPOINT <name>; } // alles in ordnung // weitere queries ... if('etwas nicht gut' [via php]) { ROLLBACK; // und zwar die ganze transaktion! } UNLOCK TABLES;
es ist doch recht einfach und in etwas das, was du sichst.
Beitrag zuletzt geändert: 23.8.2013 3:42:14 von czibere -
Dass es so geht war mir schon bewusst.
Wenn man aber etwas über InnoDb liest, steht da immer die datenintegrietät 100% gewährleistet ist. Mach es jetzt über php, das mit den 100% ist wohl etwas übertrieben. -
unlikus schrieb:
heißt es dann, dass unter php 100% datenintegrität mit zufallprinzip zu tun hat? oder komm ich da irgenwo nicht mit ... ????
... Wenn man aber etwas über InnoDb liest, steht da immer die datenintegrietät 100% gewährleistet ist. Mach es jetzt über php, das mit den 100% ist wohl etwas übertrieben. -
wenn eine transaktion nur halb ausgeführt werden kann ist die dateninegrität doch futch?
Ich sehe zwar ein, dass mysql das nicht ganz von selbst mit dem automatischen rollback machen sollte, aber es sollte schon eine Möglcihkeit geben, das einzustellen.
Vielleicht kommt das ja irgentwann in einer neuen Version. -
unlikus schrieb:
wenn eine transaktion nach diesem schema ausgeführt wired, kann die integrität darunter nicht leiden (sonst wäre im ganzen internet schon längst alles im a*sch. i.a.v. sorry).
wenn eine transaktion nur halb ausgeführt werden kann ist die dateninegrität doch futch?
Ich sehe zwar ein, dass mysql das nicht ganz von selbst mit dem automatischen rollback machen sollte, aber es sollte schon eine Möglcihkeit geben, das einzustellen.
Vielleicht kommt das ja irgentwann in einer neuen Version.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage