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