Transazioni
Le transazioni garantiscono che tutte le operazioni all'interno della transazione vengano eseguite con successo, oppure che non vengano eseguite affatto. Sono essenziali per mantenere la coerenza dei dati durante le operazioni più complesse.
Il modo più semplice di usare 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;
}
Un modo molto più pulito ed elegante per ottenere lo stesso risultato è quello di utilizzare il metodo
transaction()
. Questo metodo accetta come parametro una callback, che viene eseguita all'interno della transazione.
Se la callback viene eseguita senza lanciare un'eccezione, la transazione viene automaticamente impegnata. Se viene lanciata
un'eccezione, la transazione viene riportata indietro e l'eccezione viene ulteriormente propagata.
$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 dei valori:
$count = $database->transaction(function ($database) {
$result = $database->query('UPDATE users SET active = ?', true);
return $result->getRowCount(); // restituisce il numero di righe aggiornate
});