Frage zum autocommit-Status bei InnoDB - Tabellen

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

  • Frage zum autocommit-Status bei InnoDB - Tabellen

    Hallo,
    vielleicht hat hier ja schon jemand Erfahrung mit InnoDB - Tabellen. Ich habe eine Datenbank mit denselben angelegt und es funktioniert auch alles, habe auch Transaktionen getestet und alles klappt.

    Meine Frage ist nun: sollte ich, wenn ich innoDB - Tabellen verwende, immer , also auch bei einzelnen Statements mit begin und comit arbeiten? Oder genügt es, wenn ich Begin und Comit nur da einsetze, wo ich mehrere Statements tatsächlich zu Transaktionen zusammenfassen will?

    Funktionieren tut es bei einzelnen Statements auch ohne Begin und Comit, ich bin mir aber nicht sicher, ob es in irgendeiner Form "sicherer" ist, wenn alle Statements in Begin und Comit gepackt sind oder ob das bei einzelnen Statements egal ist.
    Der Artikel im Mysql-Handbuch dazu hat mich verwirrt:

    http://dev.mysql.com/doc/refman/4.0/de/commit.html

    Vielleicht gibts hier ja jemand, der mehr Erfahrung hat mit InnoDBs?

    Gruß
    lizju

  • #2
    Hallo lizju
    Transactions für einen SQL machen keinen Sinn.
    Eine Transaction ohne Rollback auch nicht.

    Hier 2 Beispiele wo Transactions wirklich Sinn machen:

    1. Eine Datei soll eingelesen und der Inhalt in die DB geschrieben werden
    Sagen wir, die Datei hat 1000 Zeilen und mittendrin ist ein Fehler.
    Ohne Transactions wird die Datei zur Hälfte verarbeitet.
    Man kann sie also nicht einfach reparieren und wieder einlesen,
    da ja bereits Daten verarbeitet wurden.
    Bei einer Transaction kann hier im Fehlerfall ein Rollback vorgenommen werden
    -> Der file wird entweder komplett oder gar nicht verarbeitet

    2. Das Programm schreibt in 2 verschiedene Tabellen, z.B.
    Ein Artikel wird vekauft.
    - Er muss in der Lagertabelle ausgebucht werden
    - Der Artikel muss auf den Lieferschein geschrieben werden, dabei gibt's einen Fehler
    Der user versucht's ein paar mal -> Er hat immer noch keinen Lieferschein und der Lagerbestand stimmt nicht mehr.
    Auch hier ist ein Rollback die Lösung

    PS: Speziell mit MySQL hab' ich noch keine Transactions gemacht,
    teste erst 'mal, ob sie überhaupt richtig auf Deinem MySQL funktionieren.
    Hier im Forum hatte schon 'mal einer ein echtes Problem damit.

    Kommentar


    • #3
      So, jetzt hab' ich mir die Transactions auf MySQL 'mal angesehen.
      Erster Eindruck: Läuft, MySQL wird erwachsen

      drop table if exists tmp1;
      CREATE TABLE tmp1 (A char(10)) ENGINE=InnoDB;
      XA START 'xatest';
      INSERT INTO tmp1 (A) values ("Schlecht");
      INSERT INTO tmp1 (A) values ("Schlecht");
      XA END 'xatest';
      XA PREPARE 'xatest';
      XA ROLLBACK 'xatest';
      XA START 'xatest';
      INSERT INTO tmp1 (A) values ("Gut");
      INSERT INTO tmp1 (A) values ("Gut");
      XA END 'xatest';
      XA PREPARE 'xatest';
      XA COMMIT 'xatest';

      drop table if exists tmp2;
      CREATE TABLE tmp2 (A char(10)) ENGINE=InnoDB;
      START TRANSACTION;
      INSERT INTO tmp2 (A) values ("Schlecht");
      INSERT INTO tmp2 (A) values ("Schlecht");
      ROLLBACK;
      INSERT INTO tmp2 (A) values ("Gut");
      INSERT INTO tmp2 (A) values ("Gut");
      COMMIT;

      drop table if exists tmp3;
      CREATE TABLE tmp3 (A char(10)) ENGINE=InnoDB;
      START TRANSACTION;
      SAVEPOINT sv1;
      INSERT INTO tmp3 (A) values ("Gut");
      INSERT INTO tmp3 (A) values ("Gut");
      SAVEPOINT sv2;
      INSERT INTO tmp3 (A) values ("Schlecht");
      INSERT INTO tmp3 (A) values ("Schlecht");
      ROLLBACK TO SAVEPOINT sv2;
      COMMIT;

      Kommentar

      Lädt...
      X