transacciones en php

Iniciado por OssoH, 13 Julio 2010, 17:59 PM

0 Miembros y 1 Visitante están viendo este tema.

OssoH

Hola a todos :
Tengo un código PHP que ejecuta 10 sentencias SQL. Me gustaría que si alguna de ellas fallase deshaga los cambios que las SQL anteriores ejecutadas.
¿es posible esto en PHP?
Gracias.

MinusFour

Creo que lo mejor que podrías hacer es usar los simples if/else.

Shell Root

En PHP lo dudo, pero si se puede en MSSQL. Crea un Store Procedure y consulta clausulas como
Código (sql) [Seleccionar]
BEGIN TRANSACTION
ROLLBACK
@@ERROR
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

OssoH

Por lo que he averiguado si mis tablas son MYSAM no voy a poder hacerlo.
Necesariamente las tengo que tener en MYSAM en lugar de INNODB.  :(

Lo del if/else no lo entiendo, porque si las tres primeras sentencias sQL las hace correcta y la 4 fallase ¿cómo deshago las tres últimas? 

Supongo que no hay forma humana de hacerlo por el tipo de mis tablas.

Gracias por los comentarios.

MinusFour

Pues si no funciona una sentencia SQL haces otra sentencia SQL que lo haga volver a su estado original. No es muy práctico pero debería funcionar.

Shell Root

#5
MinusFour, creo que estas confundido, imagina que son 10 transacciones. Y que pasaron 9 por las clausulas IF's, en el décimo IF, hubo un error en la consulta. Como realizas un ROLLBACK de las transacciones anteriores, IMPOSIBLE o tal vez si se puede desarrollar pero sería muy tedioso!

Yo siendo tú, migraría a MSSQL.
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

OssoH

Asi es. No puedo utilizar MSSQL porque lo tengo todo montado en MYSQL.
Gracias por los consejos.

MazarD

Y que problema hay? puedes cambiar rápidamente el engine de tus tablas con: ALTER TABLE tabla ENGINE = InnoDB; y a partir de ahí ya podrás utilizar transacciones y reglas de integridad.
-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
http://twitter.com/MazarD
irc://irc.freenode.org/elhacker.net

OssoH

Según lei esto puede tener implicaciones. Haré una copia de seguridad y lo cambiaré y probaré todo.
Gracias!!

MinusFour

#9
Es tedioso si son 10, yo estaba pensando en menos queries xD.

Código (php) [Seleccionar]


function do_mysql_queries(){

if(mysql_query($sql1) == false){ return 1;}
if(mysql_query($sql2) == false){ return 2;}
if(mysql_query($sql3) == false){ return 3;}
if(mysql_query($sql4) == false){ return 4;}

return 0;

}

function undo_mysql_queries($err_num){

switch($err_num){

case 4: mysql_query($undoQuery3);
case 3: mysql_query($undoQuery2);
case 2: mysql_query($undoQuery1);
case 1: return false;
default: return true;

}

}

if(undo_mysql_queries(do_mysql_queries())){

echo "Se ejecutaron las consultas satisfactoriamente. ";

} else {

echo "Hubo un fallo en las consultas";

}


También encontre esto, pero dice que es para php 4 así que no se que tanto te sirva.

http://www.deepbluesky.com/blog/-/myisam-transactions_20/