2010-01-25 54 views
5

mi plataforma:PHP y MySQL: código simple de implementar Transacción - Commit y Rollback

PHP & mySQL

mi situación:

Estoy tratando de poner en práctica las transacciones dentro de mi código . Traté de seguir ejemplos, pero no es de mucha ayuda. Estoy ejecutando 3 consultas y quería escribir una transacción de tal forma que si alguna de las consultas falla, toda la transacción se retrotrae. Realmente apreciaría un simple, eficiente y código PHP no orientado a objetos para lograr este objetivo. Gracias de antemano.

MI CÓDIGO PHP:

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
//commit --- but how? 
} 
else 
{ 
//rollback --- but how? 
} 
+1

se dio una respuesta y ejemplo EXCELENTE y simple (try catch) a la misma pregunta en http://stackoverflow.com/questions/2708237/php-mysql-transactions-examples must read, muestra EXACTAMENTE qué hacer en clear y términos sencillos. –

+0

Compruebe esto http://dev.mysql.com/doc/refman/5.0/en/commit.html. Esto debería guiarte en la dirección correcta. –

Respuesta

6

Usted necesita usar la mysqli extension para utilizar esta funcionalidad.

Ver: autocommit(), commit() y rollback()

<?php 
$link = mysqli_connect("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

/* disable autocommit */ 
mysqli_autocommit($link, FALSE); 

mysqli_query($link, "CREATE TABLE myCity LIKE City"); 
mysqli_query($link, "ALTER TABLE myCity Type=InnoDB"); 
mysqli_query($link, "INSERT INTO myCity SELECT * FROM City LIMIT 50"); 

/* commit insert */ 
mysqli_commit($link); 

/* delete all rows */ 
mysqli_query($link, "DELETE FROM myCity"); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity.\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Rollback */ 
mysqli_rollback($link); 

if ($result = mysqli_query($link, "SELECT COUNT(*) FROM myCity")) { 
    $row = mysqli_fetch_row($result); 
    printf("%d rows in table myCity (after rollback).\n", $row[0]); 
    /* Free result */ 
    mysqli_free_result($result); 
} 

/* Drop table myCity */ 
mysqli_query($link, "DROP TABLE myCity"); 

mysqli_close($link); 
?> 
+0

@John Gracias por su respuesta. He creado más del 85% de mi aplicación usando mysql_query. Creo que tendré que modificar mi aplicación y volver a trabajar desde cero si tengo que usar mysqli. ¿Es posible de alguna manera, hacerlo usando mysql_query? No estoy muy seguro de poder cambiar a mysqli en este punto del tiempo, por lo que una solución alternativa es muy apreciada. Espero su respuesta. – Devner

+2

Desafortunadamente no. las funciones mysql_ * no ofrecen acceso a las características avanzadas ofrecidas por MySQL 4 y posteriores, como transacciones y procedimientos almacenados. No necesita volver atrás y cambiar cada llamada a MySQL para usar mysqli. Solo cambia las páginas que realmente necesitarán usarlo. –

+0

Lo intentaré. Gracias. – Devner

13

No es necesario usar mysqli. Puede simplemente emitir los comandos de transacción como consultas.

Así que para su ejemplo:

mysql_query("start transaction;"); 

//db_res calls a custom function that performs a mysql_query on the query 
$res1 = db_res("SELECT c1, c2 FROM t1 WHERE c5 = 3"); 
$res2 = db_res("UPDATE t2 SET c1 = 5 WHERE c2 = 10"); 
$res3 = db_res("DELETE FROM t3 WHERE c1 = 20"); 

if($res1 && $res2 && $res3) 
{ 
    mysql_query("commit;"); 
} 
else 
{ 
    mysql_query("rollback;"); 
} 

Por que manera si usted está pensando en actualizar a Mysqli, por favor, no lo haga. Actualice a PDO, es mucho más sensato.

+0

Creo que te refieres a mysql_query ("iniciar transacción"); o mysql_query ("comenzar"); – Rooster242

+0

Sí, se mezclaron entre los dos ... Se arreglará. – rjmunro

+0

mysql no es seguro, intente utilizar mysqli o PDO – Asuquo12

Cuestiones relacionadas