La idea que generalmente uso cuando trabajo con transacciones se ve así (semi-pseudo-código) :
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (\Throwable $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
throw $e; // but the error must be handled anyway
}
Tenga en cuenta que, con esta idea, si una consulta falla, se debe lanzar una excepción:
- PDO puede hacer eso, dependiendo de cómo lo configures
- Ver
PDO::setAttribute
- y
PDO::ATTR_ERRMODE
yPDO::ERRMODE_EXCEPTION
- Ver
- de lo contrario, con alguna otra API, es posible que deba probar el resultado de la función utilizada para ejecutar una consulta y lanzar una excepción usted mismo.
Desafortunadamente, no hay magia involucrada. No puede simplemente colocar una instrucción en algún lugar y hacer que las transacciones se realicen automáticamente:aún debe especificar qué grupo de consultas debe ejecutarse en una transacción.
Por ejemplo, muy a menudo tendrá un par de consultas antes de la transacción (antes del begin
) y otro par de consultas después de la transacción (después de commit
o rollback
) y querrá que esas consultas se ejecuten sin importar lo que haya pasado (o no) en la transacción.