2011-03-20 16 views
7

¿Hay alguna manera de realizar transacciones con declaraciones preparadas?Declaraciones y transacciones preparadas de MySQL

quiero decir puedo utilizar el siguiente ejemplo con $mysqli->autocommit(FALSE); y $mysqli->commit(); y $mysqli->rollback();

//Preparing the statment 

$insert_stmt=$mysqli->prepare("INSERT INTO x VALUES(?,?)") 
or die($mysqli->error); 

//associate variables with the input parameters 

$insert_stmt->bind_param("is", $my_number,$my_string); //i=integer 

//Execute the statement multiple times.... 

for ($my_number = 1; $my_number <= 10; $my_number++) 
{ 
    $my_string="row ".$my_number; 
    $insert_stmt->execute() or die ($insert_stmt->error); 
} 
$insert_stmt->close(); 

He mirado alrededor, pero no encontramos un ejemplo del uso de declaraciones preparadas (no DOP): http://php.net/manual/en/mysqli.prepare.php con las transacciones, Solo encuentro ejemplos como estos mencionados aquí: http://book.opensourceproject.org.cn/lamp/mysql/mysqlstored/opensource/0596100892/mysqlspp-chp-13-sect-2.html donde las transacciones y las declaraciones preparadas nunca se entremezclan.

¿Sería incorrecto usarlos juntos?

Respuesta

7

Las declaraciones y transacciones preparadas son técnicas y tecnologías no relacionadas.

Es posible que desee emitir los comandos START TRANSACTION y COMMIT/ directamente en lugar de usar los métodos dedicados. Son funcionalmente equivalentes.

Por su bucle, que le emita el START TRANSACTIONantes sus prepare, entonces su COMMIT después el bucle termina. Probablemente no deberías intentar abrir una transacción después de que se haya iniciado una declaración preparada, pero antes de que se haya ejecutado.

Por alguna razón, no agregaron un comando "iniciar transacción" a favor de desactivar el compromiso automático. Es una de esas cosas raras sobre mysqli que siempre me hace recomendar DOP. :) La apertura de una transacción implícitamente desactiva la confirmación automática durante la transacción.

+0

Muchas gracias :) no debería comprobar si hay un error después del bucle, y revertir el error (y confirmar si no hay ningún error) – Yerel

+0

Esa es una de las otras grandes ventajas de PDO sobre mysqli - puede configurarlo para lanzar excepciones y, por lo tanto, no es necesario verificar los códigos de error una y otra vez, lo que significa que la decisión de deshacer o comprometerse se puede simplificar en gran medida. – Charles

+2

Dios mío, esto me ayuda mucho. Hice una secuencia de comandos que 'INSERT'ed ~ 5000 filas, le tomaba horas terminar. Al agregar '$ mysqli-> autocommit (FALSE);' y '$ mysqli-> commit();' ¡se ejecutó en minutos! :-) –

Cuestiones relacionadas