kostenloser Webspace werbefrei: lima-city


Automatisches Rollback

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. sallyundchamp

    sallyundchamp hat kostenlosen Webspace.

    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
  4. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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.
  5. unlikus schrieb:
    ..., dass ich einen automatischen ROLLBACK brauche, ...
    lese mal hier nach. ich vermute, das sollte es sein ;)
  6. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    Wenn ich das richtig verstanden hab, muss ich tortzdem in php prüfen ob was schief gelaufen ist, um ann die enstsprechenen statements zu senden. Suche aber eigenltich nach einer Lösung, dass mysql die transaktion selbst abbricht, wenn was schief läuft.
  7. unlikus schrieb:
    ... Suche aber eigenltich nach einer Lösung, dass mysql die transaktion selbst abbricht, wenn was schief läuft.
    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'.

    also ob etwas schief gegangen ist oder nicht, das kann dir mysql ganz ohne deine hilfe nicht wissen/entscheiden.
  8. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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
  9. unlikus schrieb:
    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.
    all das was du vor hast, ist mit einem enzigen query nicht zu schaffen.

    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.
  10. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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.
  11. sallyundchamp

    sallyundchamp hat kostenlosen Webspace.

    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
  12. also mein letzter versuch zu zeigen wie es in mysql geht (nicht aber ganz ohne php!):
    pseudocode
    START 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
  13. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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.
  14. unlikus schrieb:
    ... 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.
    heißt es dann, dass unter php 100% datenintegrität mit zufallprinzip zu tun hat? oder komm ich da irgenwo nicht mit ... ????
  15. Autor dieses Themas

    unlikus

    unlikus hat kostenlosen Webspace.

    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.
  16. unlikus schrieb:
    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.
    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).


  17. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!