Transactions

Les transactions garantissent que toutes les opérations qu'elles contiennent sont exécutées avec succès ou qu'aucune ne l'est. Elles sont essentielles pour maintenir la cohérence des données lors d'opérations plus complexes.

La façon la plus simple d'utiliser les transactions est la suivante :

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

Une façon beaucoup plus propre et élégante d'obtenir le même résultat consiste à utiliser la méthode transaction(). Cette méthode accepte un callback comme paramètre, qu'elle exécute dans la transaction. Si le callback est exécuté sans exception, la transaction est automatiquement validée. Si une exception est levée, la transaction est annulée et l'exception est propagée plus loin.

$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 renvoyer des valeurs :

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