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
});
versione: 4.0