Este tutorial fue evaluado por nuestros expertos así se asegura la exactitud de esta sección.
Solución:
La idea que generalmente uso cuando trabajo con transacciones se ve así (semipseudocó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 configure
- 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 poner 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, a menudo tendrá un par de consultas antes de la transacción. (antes de begin
) y otro par de consultas después de la transacción (después de cualquiera commit
o rollback
) y querrás que esas consultas se ejecuten sin importar lo que sucedió (O no) en la transacción.
Creo que lo he descubierto, ¿verdad ?:
mysql_query("START TRANSACTION");
$a1 = mysql_query("INSERT INTO rarara (l_id) VALUES('1')");
$a2 = mysql_query("INSERT INTO rarara (l_id) VALUES('2')");
if ($a1 and $a2)
mysql_query("COMMIT");
else
mysql_query("ROLLBACK");
Aquí puedes ver las reseñas y valoraciones de los usuarios
Acuérdate de que te concedemos esclarecer si chocaste tu rompecabezas .