Transactions

Les transactions garantissent que soit toutes les opérations au sein d'une transaction sont exécutées, soit aucune ne l'est. Elles sont utiles pour assurer la cohérence des données lors d'opérations plus complexes.

La manière la plus simple d'utiliser les transactions ressemble à ceci :

$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;
}

Vous pouvez écrire la même chose de manière beaucoup plus élégante en utilisant la méthode transaction(). Elle accepte un callback en paramètre, qu'elle exécute dans une transaction. Si le callback se déroule sans exception, la transaction est automatiquement validée (commit). Si une exception se produit, la transaction est annulée (rollback) et l'exception est propagée.

$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'
	]);
});

La méthode transaction() peut également retourner des valeurs :

$count = $database->transaction(function ($database) {
	$result = $database->query('UPDATE users SET active = ?', true);
	return $result->getRowCount(); // retourne le nombre de lignes mises à jour
});
version: 4.0