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

  • chunky
    hat ein Thema erstellt [Erledigt] Commit und Rollback.

    [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.

  • chunky
    antwortet
    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?

    Einen Kommentar schreiben:


  • waldicom
    antwortet
    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]

    Einen Kommentar schreiben:


  • Paul.Schramenko
    antwortet
    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

    Einen Kommentar schreiben:


  • smilla
    antwortet
    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ß.

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    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!

    Einen Kommentar schreiben:


  • chunky
    antwortet
    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?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    würde man mit ein paar mysql_error-Anweisungen schnell herausbekommen.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:

Lädt...
X