Severin Kacianka: /(MySQL) Transaktionen

Hallo liebes Forum,

ich versuche gerade Transaktionen zu verwenden um in einer UNIQUE-Spalte zwei Werte zu tauschen (MySQL 5.0.24,PHP 5.2):
(Das "n" am Ende jeder Zeit ist nur eine Konstante mit dem Newlinecharacter)

  
$s = 'START TRANSACTION;'.n;  
    //zuerst auf NULL setzen, da die Spalte UNIQUE ist und wir sonst DUBLIKATE bekommen würden  
$s.= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = NULL WHERE `AID` = '.(int)$lastId.';'.n;  
$s.= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = NULL WHERE `AID` = '.(int)$r['AID'].';'.n;  
$s.= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = '.(int)$r['AINDEX'].' WHERE `AID` = '.(int)$lastId.';'.n;  
$s.= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = '.(int)$lastIndex.' WHERE `AID` = '.(int)$r['AID'].';'.n;  
$s.= 'COMMIT;'.n;  
mysql_query($s);  

Quittiert MySQL mit folgender Meldung:
"Error(1064):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
UPDATE akt\_eintrag SET AINDEX = NULL WHERE AID = 96;
UPDATE `akt_eintrag' at line 1"

Die gleiche Abfrage, in mehrerern einzelnen Queries gibt keine Probleme:

  
$s = 'START TRANSACTION;'.n;  
mysql_query($s);  
//zuerst auf NULL setzen, da die Spalte UNIQUE ist und wir sonst DUBLIKATE bekommen würden  
$s= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = NULL WHERE `AID` = '.(int)$lastId.';'.n;  
mysql_query($s);  
$s= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = NULL WHERE `AID` = '.(int)$r['AID'].';'.n;  
mysql_query($s);  
$s= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = '.(int)$r['AINDEX'].' WHERE `AID` = '.(int)$lastId.';'.n;  
mysql_query($s);  
$s= 'UPDATE '.AKT_EINTRAG.' SET `AINDEX` = '.(int)$lastIndex.' WHERE `AID` = '.(int)$r['AID'].';'.n;  
mysql_query($s);  
$s= 'COMMIT;'.n;  
mysql_query($s);  

Ich würde gerne wissen wieso das so ist und ob die auch wirklich eine Transaktion ist oder mir nur so scheint. Auch verstehe ich nicht, warum ich das ganze nicht als _eine_ Abfrage an MySQL schicken kann. Im MySQL-Client-Programm kann ich diese Abfrage problemlos "in einer Wurst" abschicken.

Liebe Grüße und danke für eure Zeit,
Severin

--
They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
-- Benjamin Franklin
  1. Hello,

    Quittiert MySQL mit folgender Meldung:
    "Error(1064):You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';
    UPDATE akt\_eintrag SET AINDEX = NULL WHERE AID = 96;
    UPDATE `akt_eintrag' at line 1"

    yes, genau - denn mysql_query verarbeitet aus Sicherheitsgründen erstmal nur eine einzelne Anweisung, d.h. das Anweisungstrennzeichen ; führt zu einem Syntaxfehler.

    Ich würde gerne wissen wieso das so ist und ob die auch wirklich eine Transaktion ist oder mir nur so scheint. Auch verstehe ich nicht, warum ich das ganze nicht als _eine_ Abfrage an MySQL schicken kann. Im MySQL-Client-Programm kann ich diese Abfrage problemlos "in einer Wurst" abschicken.

    ...das kommt stark auf das "MySQL-Client-Programm" an - ist es PHPMyAdmin, da legt es dich auf's Kreuz, weil es von sich aus die Anweisungen am ";" trennt und nacheinander abfeuert. Frag mich bitte nicht, was das in Bezug auf die Transaktion heißt, ich befürchte Schlimmes...Ist es eine "echte" GUI, dann könnte es durchaus sein, dass die Befehle als einer abgefeuert werden.

    MfG
    Rouven

    --
    -------------------
    Inter Arma Enim Silent Leges  --  Cicero
    1. Hallo Rouven,

      yes, genau - denn mysql_query verarbeitet aus Sicherheitsgründen erstmal nur eine einzelne Anweisung, d.h. das Anweisungstrennzeichen ; führt zu einem Syntaxfehler.

      Danke - das erklärt mir alles!

      ...das kommt stark auf das "MySQL-Client-Programm" an - ist es PHPMyAdmin, da legt es dich auf's Kreuz, weil es von sich aus die Anweisungen am ";" trennt und nacheinander abfeuert. Frag mich bitte nicht, was das in Bezug auf die Transaktion heißt, ich befürchte Schlimmes...Ist es eine "echte" GUI, dann könnte es durchaus sein, dass die Befehle als einer abgefeuert werden.

      Ich habe das Standardprogramm verwendet. Also das das unter Linux startet, wenn man "mysql" eingibt.  Laut man-page "mysql - the MySQL command-line tool".

      PHPMyAdmin hat mich auf die Idee gebracht die eine lange Query in viele kleine zu teilen :-)

      Die Transaktionen scheinen aber "echt" zu sein. Ich habe probehalber das Skript einmal mit exit; nach den "SET AINDEX=NULL"-Queries beendet und die Änderungen wurden nicht in die Datenbank geschrieben.

      Vielen Dank für deine Antwort und liebe Grüße,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
    2. echo $begrüßung;

      yes, genau - denn mysql_query verarbeitet aus Sicherheitsgründen erstmal nur eine einzelne Anweisung, d.h. das Anweisungstrennzeichen ; führt zu einem Syntaxfehler.

      Die MySQL Improved Extension bietet die Möglichkeit, mehrere Querys mit einem Befehl abzusetzen. Dazu muss aber explizit mysqli_multi_query verwendet werden. Aus der "normalen" query-Funktion wurde diese Möglichkeit vor langer Zeit aus oben genanntem Grund gestrichen.

      Im MySQL-Client-Programm kann ich diese Abfrage problemlos "in einer Wurst" abschicken.
      ...das kommt stark auf das "MySQL-Client-Programm" an - ist es PHPMyAdmin, da legt es dich auf's Kreuz, weil es von sich aus die Anweisungen am ";" trennt und nacheinander abfeuert. Frag mich bitte nicht, was das in Bezug auf die Transaktion heißt, ich befürchte Schlimmes...

      Kein Grund zur Besorgnis. phpMyAdmin sendet alle Befehle in einer Datenbanksession ab, und da bleibt die Transaktion geöffnet.

      echo "$verabschiedung $name";