Foros del Web » Programando para Internet » PHP »

Transacciones se comitean cuando hay un die() intermedio

Estas en el tema de Transacciones se comitean cuando hay un die() intermedio en el foro de PHP en Foros del Web. Tengo planteadas varias consultas a mysql usando transacciones sobre tablas InnoDB. La cuestion es que estoy debuggeando con el viejo metodo de die(); y lo ...
  #1 (permalink)  
Antiguo 12/08/2011, 11:53
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Transacciones se comitean cuando hay un die() intermedio

Tengo planteadas varias consultas a mysql usando transacciones sobre tablas InnoDB. La cuestion es que estoy debuggeando con el viejo metodo de die(); y lo que me sorprende es que las querys a mysql que se ejecutan antes del die() se hacen efectivas, antes de que yo diga ROLLBACK o COMMIT. No es que sin COMMIT los cambios no deberían preservarse?
  #2 (permalink)  
Antiguo 12/08/2011, 12:05
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Te recomiendo esta lectura http://www.forosdelweb.com/f68/duda-...llback-933041/
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 12/08/2011, 13:11
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Gracias. Voy a usar bloques try catch. PDO la verdad que no se.

Saludos!
  #4 (permalink)  
Antiguo 12/08/2011, 13:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Si no usas PDO, no va a tener ningún efecto el bloque try/catch.

Seguramente tus transacciones se escriben en la BDD porque tienes el auto_commit en 1, o sea que en el caso de que se pierda la conexión o aunque no reciba la transacción el COMMIT respectivo, esta se escribe.

Realiza la prueba poniendo auto_commit en 0.

Saludos.
  #5 (permalink)  
Antiguo 15/08/2011, 16:50
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Ok, mañana voy a probar con esta sentencia para evitar el autocommit:
SET AUTOCOMMIT = 0

Lo de PDO todavía es algo pendiente para mi.

Gracias.
  #6 (permalink)  
Antiguo 19/08/2011, 12:07
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Miren, no estoy usando un die() en este ejemplo, pero lo que puedo asegurar es que la primer consulta si se ejecuta y la segunda no, porque se intenta hacer un UPDATE sobre un registro que no existe. Por que se graba la primer query?

Código PHP:
Ver original
  1. try
  2.             {
  3.             // Transaction        
  4.             mysql_query("SET autocommit=0");
  5.             mysql_query("BEGIN"); // Inicio de Transacción
  6.  
  7.             $sql = " UPDATE Commissions SET ";
  8.             $sql.= Fields::makeUpdatePairsForDB($data, array('comm_state', 'state_id'));      
  9.             $sql.= " WHERE comm_id = '$comm_id'";
  10.  
  11.             $result = $db->exec($sql);
  12.  
  13.             if(!$result)            
  14.                 $error=1;
  15.  
  16.             $sql = " UPDATE Payments SET ";
  17.             $sql.= $pay_field ;  
  18.             $sql.= " WHERE pay_id = (SELECT pay_id FROM Commissions_Payments WHERE comm_id = $comm_id)";
  19.             $sql.= $pay_condition;
  20.             $result = $db->exec($sql);
  21.            
  22.             if(!$result)
  23.             {
  24.                 Messages::add("Esta comision no tiene un pago relacionado. Utilice la via habitual para generarlo.", 'error', 'Error');
  25.                 $error=1;
  26.             }
  27.  
  28.             if($error)
  29.             {
  30.                 mysql_query("ROLLBACK");    
  31.                 return false;
  32.             }
  33.             else
  34.             {
  35.                 mysql_query("COMMIT");  
  36.                 return true;
  37.             }  
  38.         }
  39.         catch(Exception $e)
  40.         {            
  41.             mysql_query("ROLLBACK");    
  42.             return false;
  43.         }

Aclaro que no se esta entrando en el boque catch, aun cuando elimino el return false de la seccion if($error).

nota: las tablas son InnoDB.
  #7 (permalink)  
Antiguo 19/08/2011, 13:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Cita:
Iniciado por GatorV Ver Mensaje
Si no usas PDO, no va a tener ningún efecto el bloque try/catch.
Como te digo la extensión nativa de PHP (mysql) no tiene soporte para excepciones, para eso debes de usar PDO.

Respecto a tu ejemplo, hay que ver que hace $db->exec() para saber porque no te da el error y te hace el rollback.

Saludos.
  #8 (permalink)  
Antiguo 19/08/2011, 17:42
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: Transacciones se comitean cuando hay un die() intermedio

Ah, gracias por comentar. Ahora entiendo mejor que mysql_query no genera excepciones que puedan ser atrapadas.

Ok, ya iré entrando al mundo PDO. Por lo pronto, quitaré los try catch.

Etiquetas: mysql, tabla, 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 10:47.