Foros del Web » Programando para Internet » PHP »

Cuando usar el RollBack

Estas en el tema de Cuando usar el RollBack en el foro de PHP en Foros del Web. Estoy usando el begin, rollback y commit. Lo probe asi nomas y anda barbaro. Pero no se bien en que momento hago la llamada del ...
  #1 (permalink)  
Antiguo 22/02/2005, 13:28
Avatar de lalogrosz  
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 339
Antigüedad: 15 años, 6 meses
Puntos: 6
Cuando usar el RollBack

Estoy usando el begin, rollback y commit. Lo probe asi nomas y anda barbaro. Pero no se bien en que momento hago la llamada del rollback. Mi hipotesis es hacerlo en cada query (salvo los selects) cuando sale por die() ej:
Código PHP:
mysql_query('begin');
mysql_query($query1) or die(mysql_query('rollback'));
mysql_query($query2) or die(mysql_query('rollback'));
mysql_query($query3) or die(mysql_query('rollback'));
mysql_query('commit'); 
Esto esta bien?
Otra cosa, si lo hago en un select y pincha, no deberia hacer ahi tambien un rollback por si antes hice algun delete, por ejemplo?

Gracias
  #2 (permalink)  
Antiguo 22/02/2005, 13:42
Avatar de eft0  
Fecha de Ingreso: junio-2003
Ubicación: Santiago - Chile
Mensajes: 635
Antigüedad: 14 años, 6 meses
Puntos: 8
Vaya sorpresa que me has dado lalogrosz, no sabia que se podia hacer ROLLBACK en MySQL, funciona perfecto, cabe destacar, que al igual que para poder hacer identidad referencial, las tablas tienen que ser de tipo InnoDB.

BTW, tu ejemplo me parece acertado.

Saludos.
  #3 (permalink)  
Antiguo 22/02/2005, 20:46
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta En un insert funciona??

estoy buscando como deshacer lo que hice
con insert con mysql y php
como puedo usar el rollback??
__________________
gerardo
  #4 (permalink)  
Antiguo 23/02/2005, 06:46
Avatar de lalogrosz  
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 339
Antigüedad: 15 años, 6 meses
Puntos: 6
Bueno, aunque yo inicie este tema, ya lo estoy usando y estoy en condiciones de decirte como usarlo...

El tema es asi, cuando vas a empezar a hacer transacciones (INSERT,UPDATE,DELETE,etc, cualquier cosa que haga un cambio en la base), siempre vas a empezar a poner antes de todo eso esto
Código PHP:
mysql_query('BEGIN'); 
A continuacion tendras todos los querys que modifiquen la base pero siempre despues del query le pones el rollback por si se rompe el query:
Código PHP:
mysql_query($query) or die(mysql_query('rollback')); 
Esto es para todos los querys que tengas dentro de esta transaccion. Ante cualquier error, te deja todo como estaba antes del begin. Para cerrar el begin y para dejar claro que tiene que hacer todo lo que se le indico al mysql, hay que poner el Commit:
Código PHP:
mysql_query('COMMIT'); 
Suerte
  #5 (permalink)  
Antiguo 18/03/2005, 13:29
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta Hola una duda

En mysql estoy usando tablas MYISAM

los querys lo uso asi

$result=mysql_query('sentencia');
if($result)
{
//la linea imprimira segun que query se esta ejeutando
echo "guarado,actualizdo,borrado";

}
else
{
echo "error";
}


Usando tablas innodb

debo hacerlas asi??

mysql_query('Begin');

$result=mysql_query('sentencia');
if($result)
{
//la linea imprimira segun se query de arriba
echo "guarado,actualizdo,borrado";
}
else
{
mysql_query('rollback');
}
mysql_query('COMMIT');

esperos sus comentarios
__________________
gerardo

Última edición por chalchis; 18/03/2005 a las 13:36
  #6 (permalink)  
Antiguo 18/03/2005, 14:16
Avatar de lalogrosz  
Fecha de Ingreso: mayo-2002
Ubicación: Capital Federal
Mensajes: 339
Antigüedad: 15 años, 6 meses
Puntos: 6
No. No necesariamente hay que usar el Rollback en los tipos InnoDB. Es una opcion que se utiliza para dejar la base consistente por si ocurre algun error.
Por ejemplo queres sacar $50 del cliente A para depositarlo al cliente B, entonces restas $50, pero si en ese momento llega a pasar algun error, en la base te queda el cliente A con $50 menos y en el cliente B sin los $50.

para eso al principio de una transaccion (querys en este caso), se empieza poniendo
Código PHP:
$mysql_query('BEGIN'); 
y al final de todo el COMMIT que este indica que se ejecuta todo o no se hace nada.
El rollback se pondria en algun caso donde insertes,actualices o borres y luego pueda haber algun error. En tu ejemplo solo lo hace cuando sale de un else, pero anteriormente no hizo nada. No se si me entendes lo que te digo.
Suerte
__________________
"Vivir....solo cuesta Vida"
  #7 (permalink)  
Antiguo 18/03/2005, 14:43
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
mm podria mas claro con un ejemplo

Hola, no quiero ser fastidioso en parte si entendi
pero si me podrias poner un ejemplo en la forma
como utilizo los query junto con los conocimientos
que me has indicado...


Gracias, te lo agradecere
__________________
gerardo
  #8 (permalink)  
Antiguo 18/03/2005, 16:31
 
Fecha de Ingreso: febrero-2004
Ubicación: Bogotá, Colombia
Mensajes: 191
Antigüedad: 13 años, 10 meses
Puntos: 1
pues chalchis, arrancamos la transaccion con un BEGIN ahora, todas las consultas q se ejecuten despues de ese BEGIN no tendran efecto en la base de datos hasta q se haya hecho un COMMIT . Pero si sucede un error en las consultas puede devolver toda la transaccion con un ROLLBACK y todo quedara como iba hasta antes del BEGIN.

Por ejemplo, con un sistema de pagos
1. BEGIN(comienzo la transaccion)
2. Verifico si el cliente tiene saldo suficiente.
3. Le descuento el valor del producto a su saldo.
4. Modifico el estado del producto q voy a vender.
5. Actualizo el inventario.
6. SI PASO TODAS LAS VALIDACIONES
COMMIT
7. SINO
ROLLBACK

y no habra inconsistencia en la base de datos
  #9 (permalink)  
Antiguo 18/03/2005, 16:42
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 12 años, 8 meses
Puntos: 17
que bueno eso, justo estaba buscando algo así... gracias
¿Si el servidor se cuelga en el medio o se cierra la página PHP cuando se está ejecutando un query que pasa?
  #10 (permalink)  
Antiguo 18/03/2005, 21:38
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
seppo, Por defecto hay un rollback que no deja ejecutar "realmente" las consultas hechas despues del BEGIN. es decir la transaccion no se ejecuta
Chaop!
  #11 (permalink)  
Antiguo 22/03/2005, 11:07
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Gracias Andrecito

Voy a probar usando las tablas innodb
jeje namas tengo que actualizar el mysql

gracias, luego les comento como me fue
__________________
gerardo
  #12 (permalink)  
Antiguo 23/03/2005, 07:55
Avatar de jpogsistem  
Fecha de Ingreso: diciembre-2001
Mensajes: 2.405
Antigüedad: 16 años
Puntos: 4
Para más Info:


http://www.programacion.com/bbdd/art...transacciones/
__________________
EL LIMITE ES EL UNIVERSO
  #13 (permalink)  
Antiguo 29/03/2005, 13:40
Avatar de chalchis  
Fecha de Ingreso: julio-2003
Mensajes: 1.773
Antigüedad: 14 años, 4 meses
Puntos: 21
Pregunta Otra duda ya estoy usando innodb

Como puedo bloquear la tabla al momento de que el administrador
este haciendo cambios o consultando un registro

Como le aparacera al usuario que en el sitio querra consultar o inserta
__________________
gerardo
  #14 (permalink)  
Antiguo 29/03/2005, 13:58
 
Fecha de Ingreso: julio-2003
Ubicación: Colombia
Mensajes: 591
Antigüedad: 14 años, 4 meses
Puntos: 7
Bueno creo que este tema se sale un poco de PHP, pero mas o menos seria de esta manera..

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
en donde serializable es el nivel mas retrictivo que tiene una transaccion...
una transaccion tiene 4 propiedades basicas..

Atomicity
Consistency
Isolation
Durability

Chaop!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:45.