Transacciones
Las transacciones garantizan que todas las operaciones dentro de una transacción se ejecuten o que ninguna se ejecute. Son útiles para asegurar la consistencia de los datos en operaciones más complejas.
La forma más sencilla de usar transacciones es la siguiente:
$database->beginTransaction();
try {
$database->query('DELETE FROM articles WHERE id = ?', $id);
$database->query('INSERT INTO audit_log', [
'article_id' => $id,
'action' => 'delete'
]);
$database->commit();
} catch (\Exception $e) {
$database->rollBack();
throw $e;
}
Puede escribir lo mismo de forma mucho más elegante usando el método transaction()
. Acepta una devolución de
llamada como parámetro, que ejecuta dentro de la transacción. Si la devolución de llamada se ejecuta sin excepciones, la
transacción se confirma automáticamente (commit). Si ocurre una excepción, la transacción se cancela (rollback) y la
excepción se propaga.
$database->transaction(function ($database) use ($id) {
$database->query('DELETE FROM articles WHERE id = ?', $id);
$database->query('INSERT INTO audit_log', [
'article_id' => $id,
'action' => 'delete'
]);
});
El método transaction()
también puede devolver valores:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // devuelve el número de filas actualizadas
});