Transazioni
Le transazioni garantiscono che tutte le operazioni all'interno di una transazione vengano eseguite, oppure nessuna di esse. Sono utili per garantire la coerenza dei dati durante operazioni complesse.
Il modo più semplice per utilizzare le transazioni è il seguente:
$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;
}
Potete scrivere la stessa cosa in modo molto più elegante usando il metodo transaction()
. Accetta un callback
come parametro, che esegue all'interno della transazione. Se il callback viene eseguito senza eccezioni, la transazione viene
confermata automaticamente. Se si verifica un'eccezione, la transazione viene annullata (rollback) e l'eccezione si propaga
ulteriormente.
$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'
]);
});
Il metodo transaction()
può anche restituire valori:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // restituisce il numero di righe aggiornate
});