Mik3e
Erfahrenes Mitglied
Hi,
Mein DBMS und PHP:
MySQL 5.0.13
PHP 5.0.1
Problem:
Ich habe eine Transaction mit Commit/Rollback ausgestattet um Transaktionssicherheit zu gewährleisten.
Hier der Code:
Ich habe mich hier an Tipps von hpvw und die MySQL References gehalten.
Der Code funktioniert soweit perfekt.
ABER:
Wenn ich mir die Laufzeitinformationen von MySQL ansehe, finde ich folgendes (zur Info: Ich verwende die neueste Version von phpMyAdmin):
lock tables 0 0,00 0,00 %
begin 0 0,00 0,00 %
commit 0 0,00 0,00 %
rollback 0 0,00 0,00 %
Jetzt stellt sich mir die Frage:
Warum sehe ich die Commits etc. nicht bei den Laufzeitinformationen?
Habe ich einen Fehler im Aufbau der Transaktion? Für mich ist das alles irgendwie unlogisch. Vor allem deshalb, weil der Commit offensichtlich ausgeführt wird.
Habt Ihr einen Plan, was hier das Problem sein könnte? Oder kennt Ihr eine ander Möglichkeit um zu prüfen, ob die Transaktion wirklich transaktionssicher abgewickelt wird?
Ciao,
Mike
Mein DBMS und PHP:
MySQL 5.0.13
PHP 5.0.1
Problem:
Ich habe eine Transaction mit Commit/Rollback ausgestattet um Transaktionssicherheit zu gewährleisten.
Hier der Code:
PHP:
// Hilfsvariable für SQL Error
// ------------------------------------------------------------------
$transactionError=false;
// 1. Tabellen für Transaktion sperren und Transaktion starten
//-------------------------------------------------------------------
$sql = 'LOCK TABLES tbl_product_category write';
$this->_db->query($sql);
$sql = 'SET AUTOCOMMIT=0';
$this->_db->query($sql);
$sql = 'START TRANSACTION';
$this->_db->query($sql);
// 2. Platz für den neuen Knoten erzeugen
//-------------------------------------------------------------------
$sql = ' UPDATE '
. ' `tbl_product_category` '
. ' SET '
. ' `product_category_rgt_order`=(`product_category_rgt_order`+2) '
. ' WHERE `product_category_rgt_order`>=\''.$startParentNodeRgt.'\'; ';
$result=$this->_db->query($sql);
if (PEAR::isError($result)) {
$transactionError=true;
$this->error->addErrorMessage("<strong>".$this->language->getStaticText('ERROR_11').":</strong><br>".$result->toString());
}
$sql = ' UPDATE '
. ' `tbl_product_category` '
. ' SET '
. ' `product_category_lft_order`=(`product_category_lft_order`+2) '
. ' WHERE `product_category_lft_order`>=\''.$startParentNodeRgt.'\'; ';
$result=$this->_db->query($sql);
if (PEAR::isError($result)) {
$transactionError=true;
$this->error->addErrorMessage("<strong>".$this->language->getStaticText('ERROR_11').":</strong><br>".$result->toString());
}
// 2. Neuen Knoten in die Datenbank einfügen
//-------------------------------------------------------------------
$sql = ' INSERT INTO '
. ' `tbl_product_category` '
. ' (`product_category_lft_order`, `product_category_rgt_order`, `testtext`) '
. ' VALUES '
. ' (\''.$startParentNodeRgt.'\', \''.($startParentNodeRgt+1).'\', \''.$nodeName.'\'); ';
$result=$this->_db->query($sql);
if (PEAR::isError($result)) {
$transactionError=true;
$this->error->addErrorMessage("<strong>".$this->language->getStaticText('ERROR_11').":</strong><br>".$result->toString());
}
if ($transactionError) {
$sql = 'ROLLBACK';
$this->_db->query($sql);
$sql= 'SET AUTOCOMMIT=1';
$this->_db->query($sql);
$sql= 'ULOCK TABLES';
$this->_db->query($sql);
return false;
} else {
$sql = 'COMMIT';
$this->_db->query($sql);
$sql= 'SET AUTOCOMMIT=1';
$this->_db->query($sql);
$sql= 'ULOCK TABLES';
$this->_db->query($sql);
return true;
}
Ich habe mich hier an Tipps von hpvw und die MySQL References gehalten.
Der Code funktioniert soweit perfekt.
ABER:
Wenn ich mir die Laufzeitinformationen von MySQL ansehe, finde ich folgendes (zur Info: Ich verwende die neueste Version von phpMyAdmin):
lock tables 0 0,00 0,00 %
begin 0 0,00 0,00 %
commit 0 0,00 0,00 %
rollback 0 0,00 0,00 %
Jetzt stellt sich mir die Frage:
Warum sehe ich die Commits etc. nicht bei den Laufzeitinformationen?
Habe ich einen Fehler im Aufbau der Transaktion? Für mich ist das alles irgendwie unlogisch. Vor allem deshalb, weil der Commit offensichtlich ausgeführt wird.
Habt Ihr einen Plan, was hier das Problem sein könnte? Oder kennt Ihr eine ander Möglichkeit um zu prüfen, ob die Transaktion wirklich transaktionssicher abgewickelt wird?
Ciao,
Mike