Tengo dos objetos PHP complicados, cada uno de los cuales tiene datos en algunas tablas de MySQL.¿Cómo puede averiguar un objeto PHP PDO si ya está en una transacción MySQL?
A veces, solo necesito eliminar un objeto A de la base de datos, y eso requiere 3 instrucciones SQL.
A veces, necesito eliminar un objeto B de la base de datos, que toma 4 instrucciones SQL, y también necesita encontrar y eliminar todos los objetos A que ese objeto B posee.
Entonces, dentro de la función delete_A(), ejecuto esas instrucciones dentro de una transacción. Dentro de la función que delete_B(), quiero ejecutar una gran transacción grande que cubra las actividades dentro de delete_A(). Si todo el átomo de eliminar un B falla, necesito restaurar todas sus A en la reversión.
¿Cómo actualizo la definición de delete_A() para abrir solo una nueva transacción si no hay una transacción más grande en ejecución.
que espera que sea capaz de hacer algo así, pero no parece que cambiarse por beginTransaction()
function delete_A($a){
global $pdo;
$already_in_transaction = !$pdo->getAttribute(PDO::ATTR_AUTOCOMMIT);
if(!$already_in_transaction){
$pdo->beginTransaction();
}
//Delete the A
if(!$already_in_transaction){
$pdo->commit();
}
}
function delete_B($b){
global $pdo;
$pdo->beginTransaction();
foreach($list_of_As as $a){
delete_A($a);
}
$pdo->commit();
}
Es posible que desee considerar el uso de restricciones de clave externa (significa que tendrá que cambiar de myISAM a un motor que las admita); de esta forma, puede hacer que el db haga eliminaciones en cascada en lugar de emularlas. – prodigitalson