PDO_MYSQL Transaktion funktioniert nicht.

greggy80

Mitglied
Hallo,

ich wollte ursprünglich über die Zend_Db Transaktionen ausführen mittels eines PDO_MYSQL Adapters. Das klappte jedoch nicht, auch nicht mit einem anderen Adapter (z.B. mysqli). Dann versuchte ich einen direkten Ansatz:

PHP:
$mysql_db = "";
try {
    $mysql_db = new PDO('mysql:host=localhost;dbname=dbname', 'root', '');
} catch (PDOException $e){
    die($e->getMessage);

}

$mysql_db->beginTransaction();

try
{
    $mysql_db->exec("INSERT INTO repository_entry (currentText, insertionTimestamp) VALUES('Test', '2007-11-11')");
    $mysql_db->exec("INSERT INTO repository_entry (currentTexts, insertionTimestamp) VALUES('Test2', '2007-11-11')");
    $mysql_db->commit();
}
catch (Exception $e)
{
    $mysql_db->rollBack();
}
Das klappt allerdings auch nicht. Ich schicke per exec zwei Anfragen ab. Die zweite enthält einen offensichtlichen Syntaxfehler bei "currentTexts" (statt "currentText"). Dennoch wird der erste Datensatz einfach in die Datenbank geschrieben, es wird nicht mal eine Exception geworfen und commit() offensichtlich einfach ignoriert.
Führe ich einen Rollback allerdings ohne vorheriges beginTransaction() aus, wird sogar eine PDOException geworfen.

Woran kann dieses Verhalten liegen? Ich benutze einen MySql Clienten in der Version 5.0.37, der müsste Transaktionen doch eigentlich beherrschen können? Muss man Transaktionen vorher aktivieren? Wenn ja, dann sind sämtliche Beispiele im Internet sehr irreführend, denn dort wird immer nur ein Vorgehen ähnlich meinem beschrieben.
 
Okay, kleine Ergänzung: mit $mysql_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); habe ich den Wurf Exceptions aktualisiert und jetzt wird auch entsprechend eine Exception geworfen, das ein Syntaxfehler vorliegt. Ich habe das gleiche auch schon mit einer Constraint Violation durchgeführt, dennoch wird das commit()/rollback() komplett ignoriert und die Statements immer sofort ausgeführt.
 
Ich habe die Lösung dann doch noch alleine ermitteln können. Das Problem liegt in dem Tabellenformat MYISAM. Dies ist im Allgemeinen nicht Transaktions-tauglich, dafür wohl besonders schnell und beherrscht die Volltextindizierung.

Stattdessen ist das INNODB Format zu verwenden, das allerdings nicht zur Verfügung steht, wird es nicht explizit in der my.ini freigeschaltet. Nachdem es aber freigeschaltet ist, lässt es sich im phpmyadmin Tool beispielsweise auswählen und somit auch verwenden.

Um INNODB zu aktivieren, muss man in der my.ini Datei nach skip-innodb suchen und es auskommentieren. Danach folgen einige weitere Zeilen, die man vom Kommentar-Symbol befreien muss (dort steht beschrieben, welche Zeilen) und schon steht INNODB zur Verfügung.
 
Zurück