2011-03-09 15 views
7

estoy usando php/mysql. Sé acerca de la transacción en mysql pero no puedo usarla en mi script. A continuación se muestra mi guión ¿Cómo puedo utilizar la transacción php en mi code.i.e COMENZAR, ROLLBACK, COMMITCómo utilizar la transacción en php/mysql

foreach($json_a['shop'] as $jsondata=>$json) 
{ 
if($json['category']==='product') 
{ 
$name_product=$json['name']; 
$query1="insert into product(id,name,user_id)values('','" . mysql_real_escape_string($name_product). "','1')"; 

$result1=mysql_query($query1) or die("error in query".mysql_errno()); 
//echo "success...!"; 
$product++; 
} 
else 
if($json['category']==='order') 
{ 
$name_order=$json['name']; 
$query2="insert into order(id,name,user_id)values('','" . mysql_real_escape_string($name_order). "','1')"; 

$result2=mysql_query($query2) or die("error in query".mysql_errno()); 
$order++; 
} 
else 
if($json['category']==='sale') 
{ 
$name_sale=$json['name']; 
$query3="insert into sale(id,name,user_id)values('','" . mysql_real_escape_string($name_sale). "','1')"; 

$result3=mysql_query($query3) or die("error in query".mysql_errno()); 
$sale++; 
} 
}
+0

Usted las puede utilizar por ... su uso en los lugares correctos? ¿Puedes aclarar tu pregunta, por favor? Es difícil decir lo que estás preguntando. – Charles

+0

Pregunto por la transacción y el propósito de mi pregunta es que a veces se ejecuta la primera consulta y se insertan datos en la base de datos pero la segunda consulta no se ejecuta correctamente, por lo que quiero deshacer la transacción para que el orden de inserción no se altere. – hunter

Respuesta

12

simplemente remitir mysql_query('START TRANSACTION'); y comprobar si hay errores en cada uno de sus inserciones. Si uno de ellos no tiene éxito, emita un ROLLBACK inmediatamente sin hacer ninguna de las consultas restantes. Si todo va bien con todos, emitan un COMPROMISO.

Puede ser más fácil ponerlos en un bloque try-catch para evitar utilizar demasiados niveles de anidación con if-else.

// START TRANSACTION 
try{ 
    // INSERT 1 
    if(failed) 
     throw new Exception(); 

    // INSERT 2 
    if(failed) 
     throw new Exception(); 

    // INSERT 3 
    if(failed) 
     throw new Exception(); 

    // COMMIT 
} 
catch(Exception $e){ 
    // ROLLBACK 
} 

También puede que desee echar un vistazo dentro de PHP de PDO extension. Las transacciones son parte de sus características.

+0

+1 esta es una representación sexy, agradable y concisa de cómo debería idealmente estructurarse. – philwinkle

+0

anoté las consultas solo porque es parte de un ciclo foreach, mira mi pregunta actualizada. – hunter

+0

@hunter Puedes usar esa estrategia sin importar lo que tengas. Simplemente envuelva todo con el 'try' y cuando haya decidido que un ROLLBACK es obligatorio, lanzará una excepción. Tenga en cuenta que en su caso no puede suceder que dos de las inserciones se ejecuten en la misma ejecución, por lo que las transacciones no son realmente necesarias. ¿Planea agregar algunas otras consultas? –

2

las mismas reglas/sintaxis se aplican aquí como lo hacen en los estados de MySQL con respecto a las transacciones regulares.

He aquí un ejemplo:

$query0 = 'START TRANSACTION;'; 
mysql_query($query0) or die('woops' . mysql_error()); 

/* all of your queries here */ 

$query5 = 'COMMIT;'; 
mysql_query($query5) or die('woops' . mysql_error()); 

Más información sobre la sintaxis de MySQL para las transacciones se puede encontrar aquí: http://dev.mysql.com/doc/refman/5.0/en/commit.html

5

Una opción es usar PDO. Ejemplo:

$db = new PDO($dsn,$user,$password); 

$db->beginTransaction(); 
$db->exec("delete from mytable"); 

$allGood = doSomethingElse(); 

if ($allGood) 
{ 
    $db->commit(); 
} else { 
    $db->rollBack(); 
} 

o un método más elegante:

$db = new PDO($dsn,$user,$password); 
$db->beginTransaction(); 

try{ 
    //first execution  
    $db->exec("delete from mytable"); 

    //second execution 
    $db->exec("insert into anothertable"); 

    //if all went well 
    $db->commit(); 

} catch (Exception $e) { 

    //something broke, hit undo 
    $db->rollBack(); 

} 
Cuestiones relacionadas