Foros del Web » Programando para Internet » PHP »

ROLLBACK No funciona.

Estas en el tema de ROLLBACK No funciona. en el foro de PHP en Foros del Web. Hola chicos estoy buscando los pelos al huevo y no quiero que se me filtre ninguno... Para eso ROLLBACK me parece una funcion excelente, pero ...
  #1 (permalink)  
Antiguo 27/10/2011, 15:42
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
ROLLBACK No funciona.

Hola chicos estoy buscando los pelos al huevo y no quiero que se me filtre ninguno...

Para eso ROLLBACK me parece una funcion excelente, pero no funK.

Les cuento basicamente estoy descontando x Cantidad de un producto... esto viene de un form. Antes pasa por una validacion y el problema viene a que si alguien completa una linea con X producto y X cantidad, y en otra linea vuelve a poner el mismo producto con X cantidad, la validacion se filtra un error. Como tambien quiero aprender un poco de MySQL me encontre con ROLLBACK

Bueno lo primero que hice fue:

SET GLOBAL autocommit='OFF'

despues:


Código PHP:
<?php
mysql_query
("START TRANSACTION")or die(mysql_error());
foreach    (    
$_POST    as    $key    =>    $value    ){$$key    =    $value;}
for(    
$i    =    '1'    ;    $i<=$row    ;$i++    )
{
    
$UPDATE    =    "UPDATE articulos SET cantidad = cantidad-'$cantidad' WHERE id='$id' AND cantidad-'$cantidad'>= '0'";
    
mysql_query(    $UPDATE    )or die(    mysql_error()    );
    
$afectadas=mysql_affected_rows();
    if(
$afectadas=='0')
        {
            
mysql_query("ROLLBACK") or die(mysql_error());
            echo 
'<script>alert( "Por algun motivo no se pudo hacer el proceso\n\r Por favor vuelva a intantar");</script>';                exit;
        }
}
    
mysql_query("COMMIT") or die(mysql_error());
Bueno en el $UPDATE descuento la cantidad de producto si esta resta no deja el stock negativo.
En caso esto puede pasar mysql_affected_rows() arroja "0" y ejecuto el ROLLBACK y un alert en javascript.
Caso contrario el COMMIT termina la TRANSACTION.

1- Descuento 2 productos.
2- Obligo al sistema a que intente restar x cantidad de un producto dejando a este en stock negativo.
El Alert de javascript se dispara y termina en exit; pero el ROLLBACK no. (Los dos producto no vuelven a su cantidad original).

Algun comentario
__________________
Mono programando!
twitter.com/eguimariano
  #2 (permalink)  
Antiguo 27/10/2011, 15:48
Avatar de jotaincubus  
Fecha de Ingreso: mayo-2005
Ubicación: Medellin - Colombia
Mensajes: 1.797
Antigüedad: 18 años, 10 meses
Puntos: 394
Respuesta: ROLLBACK No funciona.

Hola, mira este tema me saco de la duda el ROLLBACK
__________________
Por que existe gente que no agradece después de que se le ha brindado tiempo y ayuda ???
  #3 (permalink)  
Antiguo 27/10/2011, 16:12
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: ROLLBACK No funciona.

Cita:
Iniciado por jotaincubus Ver Mensaje
Hola, mira este tema me saco de la duda el ROLLBACK
Creo que se me mesclo mucho con PDO (que todavia no domino)...

Pero creo mi logica esta bien, hasta que no envie un COMMIT no escribe todas las consultas despues del: START TRANSACTION

CITO :Tras deshabilitar el modo autocommit poniendo la variable AUTOCOMMIT a cero, debe usar COMMIT para almacenar los cambios en disco o ROLLBACK si quiere ignorar los cambios hechos desde el comienzo de la transacción.

Yo ejecuto ROLLBACK y exit(para que no continue el for) y en cambio escribe todos los UPDATE antes del "error"(que no es un error ya que la consulta tiene una condicion digamos affected_rows=0).
__________________
Mono programando!
twitter.com/eguimariano
  #4 (permalink)  
Antiguo 27/10/2011, 16:17
Avatar de SirDuque  
Fecha de Ingreso: febrero-2009
Ubicación: Paso del Rey, Buenos Aires, Argentina
Mensajes: 975
Antigüedad: 15 años, 2 meses
Puntos: 89
Respuesta: ROLLBACK No funciona.

Acabo de hacer esta prueba en PhpMyAdmin y el resultado no lo entiendo:


Código MySQL:
Ver original
  1. UPDATE `db1`.`articulos` SET `cantidad` = '2' WHERE `articulos`.`id` = 8050;
  2. UPDATE articulos SET cantidad = cantidad-'1' WHERE id='8050' AND cantidad-1>='0';
  3. UPDATE articulos SET cantidad = cantidad-'1' WHERE id='8050' AND cantidad-1>='0';
  4. UPDATE articulos SET cantidad = cantidad-'1' WHERE id='8050' AND cantidad-1>='0';
  5. SELECT cantidad FROM articulos WHERE id='8050';

cantidad= 0
__________________
Mono programando!
twitter.com/eguimariano

Etiquetas: mysql, mysql+php, rollback, transacciones
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 13:49.