Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Commit und Rollback

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Commit und Rollback

    Hi. In meiner Anwendung muss ich eine Transaktion verwenden, um zu verhindern, dass Daten bei einem Fehler geschrieben werden.

    PHP-Code:
    <?php

    $mysql_commit 
    "COMMIT";

    mysql_query("START TRANSACTION");

    try {

        
    mysql_query("INSERT INTO `table` (`id`, `type`, `title`) VALUES (NULL, 'picture', 'test')");

        throw new 
    Exception ('TEST EXCEPTION');

    //try
    catch (Exception $e) {

        echo 
    $e->getMessage().PHP_EOL;

        
    //rollback!
        
    $mysql_commit "ROLLBACK";
    }

    //commit or rollback
    mysql_query($mysql_commit);

    echo 
    "commit: ".$mysql_commit;
    ?>
    Der Output ist wie erwartet
    TEST EXCEPTION
    commit: ROLLBACK
    Jedoch wird der Datensatz trotzdem geschrieben!
    Ein "SET AUTOCOMMIT = 0" habe ich schon probiert, das hat jedoch nicht die gewünschte Wirkung gezeigt.

  • #2
    Kann es sein, dass die verwendete Speicherengine nicht transaktionssicher ist? InnoDB ist z.B. transaktionssicher, MyISAM dagegen nicht.

    Kommentar


    • #3
      würde man mit ein paar mysql_error-Anweisungen schnell herausbekommen.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Zitat von nikosch Beitrag anzeigen
        würde man mit ein paar mysql_error-Anweisungen schnell herausbekommen.
        Ich weiss nicht was du meinst. mysql_error() gibt es keine in dem Skript.

        Zitat von Multivac Beitrag anzeigen
        Kann es sein, dass die verwendete Speicherengine nicht transaktionssicher ist?
        Die Tabellen habe ich alle als MyISAM angelegt, weil das meines Wissens nach am meisten verbreitet ist.

        Rollback funktioniert also bei MyISAM nicht?
        Meine Anwendung enthält nicht nur ein Datenbank-Update, sondern etwa 15 in Folge. Wenn eines schief geht, möchte ich alle bereits geschrieben Daten rückgängig machen.
        Ein Rollback wäre ideal dafür!

        Wie macht ihr das denn sonst?

        Kommentar


        • #5
          Ich weiss nicht was du meinst. mysql_error() gibt es keine in dem Skript.
          Eben.
          Wie macht ihr das denn sonst?
          Wie macht man Dinge, die nicht gehen? Gar nicht!
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            Nun, was. Mit mysqli soll es wohl gehen.
            Jedoch kann ich nicht voraussetzen, dass das installiert ist.

            Kommentar


            • #7
              Zitat von chunky Beitrag anzeigen
              Mit mysqli soll es wohl gehen.
              Quatsch. Daran, dass du mit MyISAM die falsche Engine für dein Vorhaben gewählt hast, kann die API auch nichts ändern.

              Jedoch kann ich nicht voraussetzen, dass das installiert ist.
              Das, was du voraussetzen willst, ist die Verfügbarkeit von InnoDB als Engine.
              Die ist nicht immer gegeben, bei den meisten vernünftigen Hostern aber schon.

              Und bei Anwendungen, deren Geschäftslogik Rollbacks benötigt, die also in ihrer Bedeutung über die eines popeligen Gästebuchs o.ä. hinausgehen, kann man auch durchaus gewisse Anforderungen an die Umgebung, in der sie betrieben werden können, stellen.
              [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

              Kommentar


              • #8
                Ich würde InnoDB nur nur nutzen, wenn die Erfahrung da ist. Denn Backups sind komplizierter als bei MyIsam und wenn der Server mal "abkackt" braucht es schon seine Zeit, bis der alles wieder regeneriert hat.

                Transactionssicherheit ist schon genial, die fehlt mir auch an einigen Stellen, da was mal vorkommt das ein SQL einfach nicht ausgeführt wurde. Aber dazu stehe ich mit InnoDB zu sehr auf Kriegsfuß.

                Kommentar


                • #9
                  Also so schlecht finde ich InnoDB nicht. Ich benutze bei allen halbwegs wichtigen Tabellen InnoDB.
                  Und wie dieser benchamark Test beweist ist es auch gar net so schlecht:
                  Benchmark-Test

                  Ist zwar schon ein bischen älter, aber des passt schon
                  "My software never has bugs, it just develops random features."
                  "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                  Kommentar


                  • #10
                    Zitat von smilla Beitrag anzeigen
                    Ich würde InnoDB nur nur nutzen, wenn die Erfahrung da ist. Denn Backups sind komplizierter als bei MyIsam und wenn der Server mal "abkackt" braucht es schon seine Zeit, bis der alles wieder regeneriert hat.
                    Transactionssicherheit ist schon genial, die fehlt mir auch an einigen Stellen, da was mal vorkommt das ein SQL einfach nicht ausgeführt wurde. Aber dazu stehe ich mit InnoDB zu sehr auf Kriegsfuß.
                    [ot]
                    Aber nur Inno-DB (von gängigen MySQL-Engines) unterstützt foreign keys, oder?
                    Und ein großes System ohne foreign keys macht nicht sehr viel Sinn
                    [/ot]

                    Kommentar


                    • #11
                      Ich habe das jetzt mit Abfragen und Zwischenspeicherungen gelöst. Anstelle von Dateilöschungen gibt's jetzt eben Kopieren in ein temporäres Verzeichnis, etc.
                      War eine Heidenarbeit... aber InnoDB wollte ich eben nicht zur Voraussetzung für meine Anwendung machen.

                      Zitat von smilla Beitrag anzeigen
                      Denn Backups sind komplizierter als bei MyIsam...
                      Mit InnoDB kenne ich mich nicht aus. Wieso sind denn Backups da schwerer? Funktioniert mysqldump mit InnoDB nicht?

                      Kommentar

                      Lädt...
                      X