Transaktion rollback commit funktioniert nicht
Transaktion rollback commit funktioniert nicht
am 13.10.2006 12:44:15 von aliyealiye
Guten Tag,
ich habe versucht eine Transaktion aufzustellen in PHP. Es soll nicht
gemacht werden wenn die Bedingung if If Teil nicht zutrift. Allerdings
funktioniert es nicht. InnoDB ist eingeschaltet. Was mache ich falsch?
Das einfügen in die Datenbank funktioniert immer, obwohl es in das
If-Teil reinläuft und NICHTGEMACHT ausgegeben wird.
Hier das Script Teil:
mysql_query('begin');
$update_1=3D"LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
$update_result1 =3D mysql_query($update_1);
$anz_rows1=3Dmysql_affected_rows();
if ($anz1!=3D40124)
{mysql_query('rollback'); echo "NICHTGEMACHT!!";}
else
{mysql_query('commit');}
Vielen Dank
Saladin
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 13:09:52 von Andreas Scherbaum
Saladin wrote:
^^^^^^^
Realnamen sind gern gesehen, ich weiss gern, mit wem ich mich
unterhalte.
> InnoDB ist eingeschaltet.
Ist deine Tabelle auch vom Typ Innodb?
> mysql_query('begin');
Wo ist die Fehlerprüfung?
> $update_1="LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
> $update_result1 = mysql_query($update_1);
Wo ist die Fehlerprüfung?
Jetzt stellt sich mir noch die Frage, ob man LOAD DATA in eine
Transaktion packen kann, die Mysql Doku ist da nicht sehr
auskunftsfreudig, also würde ich das selbe Beispiel mal mit
einem normalen Insert probieren und schauen, ob es damit
funktioniert.
> if ($anz1!=40124)
Würde es nicht einfach reichen, vorher das Ergebnis des Queries
zu prüfen, anstatt hier mit der Anzahl Zeilen zu rechnen?
Überhaupt, wieviele Zeilen werden denn effektiv geschrieben?
> {mysql_query('rollback'); echo "NICHTGEMACHT!!";}
Das obligatorische: Fehlerprüfung fehlt.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 13:11:04 von GreenRover
Saladin schrieb:
> mysql_query('begin');
> $update_1="LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
> $update_result1 = mysql_query($update_1);
> $anz_rows1=mysql_affected_rows();
> if ($anz1!=40124)
> {mysql_query('rollback'); echo "NICHTGEMACHT!!";}
> else
> {mysql_query('commit');}
Joa ne ist schon lustig wie man in solch kurzen Script sich mit seinen
Variabelen verhasbeln kann.
$anz1!=$anz_rows1
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 13:20:10 von Carsten Wiedmann
Saladin schrieb:
> ich habe versucht eine Transaktion aufzustellen in PHP. Es soll nicht
> gemacht werden wenn die Bedingung if If Teil nicht zutrift. Allerdings
> funktioniert es nicht. InnoDB ist eingeschaltet. Was mache ich falsch?
Mal abgesehen davon, dass InnoDB in MySQL eingeschaltet (verfügbar) ist, ist
die Engine deiner Tabelle auch vom Typ InnoDB?
> Das einfügen in die Datenbank funktioniert immer, obwohl es in das
> If-Teil reinläuft und NICHTGEMACHT ausgegeben wird.
>
> Hier das Script Teil:
>
> mysql_query('begin');
Du solltest vorher evtl. das AUTOCOMMIT abschalten.
> $update_1="LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
Bei "LOAD DATA INFILE" kommt es auf deine MySQL-Version darauf an, ob ein
implizierter COMMIT stattfindet, oder nicht.
> $update_result1 = mysql_query($update_1);
> $anz_rows1=mysql_affected_rows();
> if ($anz1!=40124)
Das wurde ja schon nebenam erklärt ;-) ($anz_rows1 anstatt $anz1)
> {mysql_query('rollback'); echo "NICHTGEMACHT!!";}
> else
> {mysql_query('commit');}
Gruß
Carsten
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 13:42:16 von Andreas Scherbaum
Carsten Wiedmann wrote:
> Saladin schrieb:
>
>> $update_1="LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
>
> Bei "LOAD DATA INFILE" kommt es auf deine MySQL-Version darauf an, ob ein
> implizierter COMMIT stattfindet, oder nicht.
Nicht das ich das häufig brauchen würde, aber die Online Doku sagt nichts
über Commit oder überhaupt über Transaktionen zu dem Thema aus.
(Zumindest nicht die für 4.x und 5.0, wo ich vorhin geschaut hatte.)
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 14:49:13 von aliyealiye
Ich habe festgestellt dass die Engine meiner Tabelle MyISAM ist. Kann
ich dies unter phpMyAdmin auf InnoDB umändern ?
Wie kann ich das AUTOCOMMIT abschalten ?
Mit set AUTOCOMMIT =3D0 direkt im php script ?
Carsten Wiedmann schrieb:
> Saladin schrieb:
>
> > ich habe versucht eine Transaktion aufzustellen in PHP. Es soll nicht
> > gemacht werden wenn die Bedingung if If Teil nicht zutrift. Allerdings
> > funktioniert es nicht. InnoDB ist eingeschaltet. Was mache ich falsch?
>
> Mal abgesehen davon, dass InnoDB in MySQL eingeschaltet (verfügbar) ist=
, ist
> die Engine deiner Tabelle auch vom Typ InnoDB?
>
>
> > Das einfügen in die Datenbank funktioniert immer, obwohl es in das
> > If-Teil reinläuft und NICHTGEMACHT ausgegeben wird.
> >
> > Hier das Script Teil:
> >
> > mysql_query('begin');
>
> Du solltest vorher evtl. das AUTOCOMMIT abschalten.
>
>
> > $update_1=3D"LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
>
> Bei "LOAD DATA INFILE" kommt es auf deine MySQL-Version darauf an, ob ein
> implizierter COMMIT stattfindet, oder nicht.
>
>
> > $update_result1 =3D mysql_query($update_1);
> > $anz_rows1=3Dmysql_affected_rows();
> > if ($anz1!=3D40124)
>
> Das wurde ja schon nebenam erklärt ;-) ($anz_rows1 anstatt $anz1)
>
>
> > {mysql_query('rollback'); echo "NICHTGEMACHT!!";}
> > else
> > {mysql_query('commit');}
>=20
> Gruß
> Carsten
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 15:04:34 von Andreas Scherbaum
Saladin wrote:
>
> Ich habe festgestellt dass die Engine meiner Tabelle MyISAM ist. Kann
> ich dies unter phpMyAdmin auf InnoDB umändern ?
Lös erst einmal dieses Problem, dann schau, ob es dann funktioniert.
Den Tabellentyp kannst du mit Alter Table ändern.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 13.10.2006 15:25:05 von aliyealiye
Tabellentyp habe ich umgeändert. Funktioniert aber trotzdem nicht.
Andreas Scherbaum schrieb:
> Saladin wrote:
> >
> > Ich habe festgestellt dass die Engine meiner Tabelle MyISAM ist. Kann
> > ich dies unter phpMyAdmin auf InnoDB umändern ?
>
> Lös erst einmal dieses Problem, dann schau, ob es dann funktioniert.
>
> Den Tabellentyp kannst du mit Alter Table ändern.
>
>
> Bye
>
> --
> Andreas 'ads' Scherbaum
> Failure is not an option. It comes bundled with your Microsoft product.
> (Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 14.10.2006 01:06:34 von Carsten Wiedmann
Andreas Scherbaum schrieb:
> Carsten Wiedmann schrieb:
> >
> > Bei "LOAD DATA INFILE" kommt es auf deine MySQL-Version darauf an, ob
> > ein implizierter COMMIT stattfindet, oder nicht.
>
> Nicht das ich das häufig brauchen würde, aber die Online Doku sagt nichts
> über Commit oder überhaupt über Transaktionen zu dem Thema aus.
> (Zumindest nicht die für 4.x und 5.0, wo ich vorhin geschaut hatte.)
14.2.10.9. Implicit Transaction Commit and Rollback
http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commi t.html
Gruß
Carsten
Re: Transaktion rollback commit funktioniert nicht
am 14.10.2006 11:40:18 von Andreas Scherbaum
Carsten Wiedmann wrote:
> Andreas Scherbaum schrieb:
>
>> Carsten Wiedmann schrieb:
>> >
>> > Bei "LOAD DATA INFILE" kommt es auf deine MySQL-Version darauf an, ob
>> > ein implizierter COMMIT stattfindet, oder nicht.
>>
>> Nicht das ich das häufig brauchen würde, aber die Online Doku sagt nichts
>> über Commit oder überhaupt über Transaktionen zu dem Thema aus.
>> (Zumindest nicht die für 4.x und 5.0, wo ich vorhin geschaut hatte.)
>
> 14.2.10.9. Implicit Transaction Commit and Rollback
> http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commi t.html
Ah, sehr toll: ich nutze den Befehl "LOAD DATA INFILE" und werde auf
eine Dokuseite bei Innodb verwiesen, um die "dokumentierten Features" (sprich:
Ungereimtheiten) von Mysql zu finden.
Diese Art von Informationen zusammensuchen hat gewiss einen Mehrwert, nur
sehe ich den nicht.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 14.10.2006 12:11:02 von Kris
Carsten Wiedmann wrote:
> Mal abgesehen davon, dass InnoDB in MySQL eingeschaltet (verfügbar) ist,
> ist die Engine deiner Tabelle auch vom Typ InnoDB?
Weitere Hinweise:
SHOW ENGINES zeigt die verfügbaren Storage Engines an. InnoDB kann NO, YES,
DISABLED oder DEFAULT sein. Wenn es DISABLED ist, ist der Code in mysqld
enthalten, aber InnoDB kann nicht gestartet werden. Die Ursache kann ein
skip-innodb in der Konfig oder ein Konfigurationsfehler sein - näheres
steht im Error Log.
Indem man im sql_mode NO_ENGINE_SUBSTITUTION setzt, kann man verhindern, daÃ
bei ausgeschaltetem InnoDB Ersatz-Engines wie MyISAM verwendet werden.
AUTOCOMMIT ist per Default an, und man kann es mit SET AUTOCOMMIT=0 auch per
PHP für eine Connection abschalten.
Auf das Beispiel hat das aber keinen Einfluà - auch mit AUTOCOMMIT beginnt
"BEGIN" eine neue Transaktion und Autocommit ist dann bis zum COMMIT oder
ROLLBACK abgeschaltet.
Kris
Re: Transaktion rollback commit funktioniert nicht
am 14.10.2006 12:13:00 von Kris
Saladin wrote:
> $update_1="LOAD DATA INFILE 'text.txt' INTO TABLE produkte;";
"Prior to MySQL 5.0.26, LOAD DATA INFILE also caused an implicit commit for
InnoDB tables (as was true for all storage engines)."
http://dev.mysql.com/doc/refman/5.0/en/innodb-implicit-commi t.html
Kris
Re: Transaktion rollback commit funktioniert nicht
am 16.10.2006 11:03:51 von aliyealiye
Hallo,
ich habe die Tabelle auf InnoDB umgestellt. SET Autocommit=3D0 gestezt.
Es funktioniert aber immer noch nicht. Das Script srpingt in den If
Teil wo ein Rollback gemacht werden sollte, aber es wird trotzden nicht
genacht. Die Inhalte werden eingefügt.
Ich habe noch eine generelle Frage. Ich habe ja meine MyISAM Tabelle in
InnoDB umgestellt. Was für Auswirkungen kann es auf Anwendungen haben,
die mit MyISAM laufen?
mysql_query('begin');
$update_1=3D"LOAD DATA INFILE 'datei1.txt' INTO TABLE prdoukte;";
$update_result1 =3D mysql_query($update_1) or die ("Update in der Tabelle
products nicht erfolgreich");
$anz_rows1=3Dmysql_affected_rows();
$update_2=3D"LOAD DATA INFILE 'datei2.txt' INTO TABLE
produktbeschreibung;";
$update_result2 =3D mysql_query($update_2) or die ("Update in der Tabelle
products_description nicht erfolgreich");
$anz_rows1=3Dmysql_affected_rows();
if ($anz1!=3D$anz_rows1 OR $anz2!=3D$anz_rows2)
{mysql_query('rollback'); echo "NICHTGEMACHT!!";}
else
{mysql_query('commit');}
Re: Transaktion rollback commit funktioniert nicht
am 16.10.2006 12:56:13 von Andreas Scherbaum
Hallo,
Saladin wrote:
> Ich habe noch eine generelle Frage. Ich habe ja meine MyISAM Tabelle in
> InnoDB umgestellt. Was für Auswirkungen kann es auf Anwendungen haben,
> die mit MyISAM laufen?
Sie funktionieren gleich oder anders, wer weiss das bei Mysql
schon so genau ...
Zu deinem Code Problem, du wurdest schon einmal darauf hingewiesen:
> if ($anz1!=$anz_rows1 OR $anz2!=$anz_rows2)
Wo werden denn $anz1 oder $anz2 gefüllt? Was steht in diesen Variblen
drin und wenn dort nicht ausgerechnet die erwartete Zeilenzahl steht,
dann sollte klar sein, woher dein Fehler kommt.
Bye
--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)
Re: Transaktion rollback commit funktioniert nicht
am 17.10.2006 11:35:38 von dev-null-use-reply-adress
Irgendwer oder -was schrieb:
[Nullquote]
> ich habe die Tabelle auf InnoDB umgestellt. SET Autocommit=0 gestezt.
> Es funktioniert aber immer noch nicht. Das Script srpingt in den If
> Teil wo ein Rollback gemacht werden sollte, aber es wird trotzden nicht
> genacht. Die Inhalte werden eingefügt.
Hast Du nicht gelesen, was Kristian Dir aus dem Manual zitiert hat?
> Ich habe noch eine generelle Frage. Ich habe ja meine MyISAM Tabelle in
> InnoDB umgestellt. Was für Auswirkungen kann es auf Anwendungen haben,
> die mit MyISAM laufen?
Die Anwendung läuft doch nicht mit einem bestimmten Tabellentyp.
Die interessiert das also herzlich wenig. Du kannst in einen Projekt
auch gerne Tabellen unterschiedlichen Typs verwenden.
BTW: Um Deine Leser nicht zu verärgern und die Antwortwahrscheinlichkeit
zu erhöhen, empfehle ich Dir dringend, Dir einen Realnamen zu zulegen
(Ja, das geht auch bei Google Groups), sowie lernen richtig zu quoten
(http://learn.to/quote).
Gruß
JPM