Ver Mensaje Individual
  #6 (permalink)  
Antiguo 19/08/2011, 12:07
Avatar de mayid
mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 16 años
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.