Raketenwilli: Nachtrag: PHP, MySQL Abbruch vermeiden

Beitrag lesen

Autsch, ich habe offenbar viel zu selten mit MyISAM gearbeitet. Dass MyISAM auf Kosten von Tempo und Speicher auf vieles verzichtet, wusste ich, aber es weiß ja von ACID wirklich gar nichts und ist damit nichts weiter als dBASE mit SQL-Frontend.

So ähnlich ... aber MyISAM ist so „raus“ wie Minix als Linux-Dateisystem.

Default-Type ist seit Jahren InnoDB, das kann Transaktionen.

InnoDB kann Transaktionen. Es hat per Default Autocommit, und das findet nach jedem einzelnen Statement statt. Läuft ein Statement auf einen Error, gibt's automatisch einen Rollback auf dieses Statement. Handbuch:

Stell Dir das so vor, als gäbe es eine Super-Transaktion - das passt auch ganz gut.

In dieser wird für jede Verbindung eine Kind-Transaktion gestartet, in welcher das autocommit auf On steht: Alle Änderungen werden sofort der Eltern-Transaktion, in dem Fall der Super-Transaktion verpetzt, die natürlich gleich einen Zettel an den Kühlschrank hängt, damit alle Kinder (und weil die als Eltern auch einen Zettel an den Kühlschrank hän Kindeskinder davon wissen.

Um das automatische Committen abzustellen hast Du ZWEI Möglichkeiten:

Entweder SET autocommit=0;, also durch die Variable in der Kind-Transaktion oder durch Starten einer Enkeltransaktion. In der ist das autocommit automatisch abgeschaltet.

Der Effekt (Isolation) ist bei beiden Varianten gleich. Aber die Variante mit der Subtransaktion („Enkeltransaktion“) zieht einen etwas höheren Aufwand auf der Systemseite nach sich:

„Supertransaktion“
       |
       +- Kindtransaktion für Verbindung
       |  automatisch: autocommit=1;
       |       |
       |       + Enkeltransaktion
       |         automatisch: autocommit=0; 
       |
       +- Kindtransaktion für Verbindung
          automatisch:     autocommit=1;
          manuell gesetzt: autocommit=0;