2012-05-08 31 views
12

¿Pueden ocurrir llamadas dentro de un bloque de transacción PDO? Este código se simplifica (usando la base de datos MySQL) ...PDO Transacciones y llamadas a funciones

try{ 
    $db->beginTransaction(); 

    // call to function that creates user 
    $user_id = create_user(); 

    // call to function that creates company  
    $company_id = create_company(); 

    // call to function to link user & company 
    add_user_to_company($user_id, $company_id); 

    $db->commit(); 
} 

Si esto no puede ocurrir el uso de transacciones, ¿cuál es la estrategia recomendada?

Respuesta

11

A menos que cualquiera de esas llamadas a funciones intente abrir o confirmar una transacción, o usar una conexión diferente a la almacenada en $db, sí, debería funcionar bien. El objeto PDO (o el RDBMS para el caso) no sabe o no le importa si llama a otras funciones en PHP. Todo lo que sabe es si la acción tiene lugar en la misma conexión abierta que la que se abrió en $db. Suponemos que esas funciones reciben $db como parámetro o acceden a él globalmente.

Recuerde que aunque PDO realiza un seguimiento del estado de la transacción (expuesto a través de PDO::inTransaction()), realmente es el RDBMS el que está administrando el estado de la transacción, no PDO o el código de la aplicación PHP. Si una función intenta abrir una nueva transacción antes de que se haya cometido la anterior, MySQL's documented behavior debe confirmar automáticamente la transacción anterior, ya que no admite la anidación de transacciones.

Solo asegúrese de que las llamadas a funciones adicionales no intenten cambiar el estado de la transacción.

+1

Para aclarar más, las transacciones anidadas no son compatibles con MySQL, así que asegúrese de no iniciar una transacción dentro de ninguna de las funciones, de lo contrario [confirmará automáticamente la transacción pendiente] (http: //dev.mysql .com/doc/refman/5.5/es/implicit-commit.html). –

+1

También asegúrese de no utilizar ningún tipo de DDL (crear/alterar/soltar declaraciones) porque comprometerán cualquier transacción que haya tenido. – Kris

Cuestiones relacionadas