PHP 8.4 Essentials
Thème :
Junior
1 vues ·23/23 leçonsTransactions de Base de Données
Les transactions garantissent que plusieurs opérations de base de données réussissent toutes ensemble ou échouent toutes ensemble, préservant l’intégrité des données.
Qu’est-ce qu’une Transaction ?
Une transaction regroupe des opérations traitées comme une seule unité. Elle respecte les propriétés ACID :
- Atomicité : Tout ou rien.
- Cohérence : Les données restent dans un état valide.
- Isolation : Les opérations ne s’interfèrent pas.
- Durabilité : Les modifications persistent après le commit.
Transaction de Base
<?php
try {
$pdo->beginTransaction();
// Plusieurs opérations
$pdo->exec("UPDATE comptes SET solde = solde - 100 WHERE id = 1");
$pdo->exec("UPDATE comptes SET solde = solde + 100 WHERE id = 2");
// Si on arrive ici, valider toutes les modifications
$pdo->commit();
} catch (Exception $e) {
// Quelque chose s'est mal passé, annuler tout
$pdo->rollBack();
throw $e;
}
Exemple Pratique : Traitement de Commande
<?php
function creerCommande(PDO $pdo, int $userId, array $articles): int {
$pdo->beginTransaction();
try {
// 1. Créer la commande
$stmt = $pdo->prepare(
'INSERT INTO commandes (user_id, statut, cree_le)
VALUES (:user_id, :statut, NOW())'
);
$stmt->execute([':user_id' => $userId, ':statut' => 'en_attente']);
$commandeId = (int) $pdo->lastInsertId();
// 2. Ajouter les articles et mettre à jour le stock
$articleStmt = $pdo->prepare(
'INSERT INTO articles_commande (commande_id, produit_id, quantite, prix)
VALUES (:commande_id, :produit_id, :quantite, :prix)'
);
$stockStmt = $pdo->prepare(
'UPDATE produits SET stock = stock - :qte WHERE id = :id AND stock >= :qte'
);
foreach ($articles as $article) {
// Réduire le stock
$stockStmt->execute([
':qte' => $article['quantite'],
':id' => $article['produit_id']
]);
// Vérifier si le stock a bien été réduit
if ($stockStmt->rowCount() === 0) {
throw new Exception("Stock insuffisant pour le produit {$article['produit_id']}");
}
// Ajouter l'article à la commande
$articleStmt->execute([
':commande_id' => $commandeId,
':produit_id' => $article['produit_id'],
':quantite' => $article['quantite'],
':prix' => $article['prix']
]);
}
$pdo->commit();
return $commandeId;
} catch (Exception $e) {
$pdo->rollBack();
throw $e;
}
}
Méthodes de Transaction
<?php
$pdo->beginTransaction(); // Démarrer la transaction
$pdo->commit(); // Valider toutes les modifications
$pdo->rollBack(); // Annuler toutes les modifications
$pdo->inTransaction(); // Vérifier si on est dans une transaction (bool)
Patron : Gestionnaire de Transaction Imbriquée
<?php
class GestionnaireTransaction {
private int $niveau = 0;
public function __construct(private PDO $pdo) {}
public function debuter(): void {
if ($this->niveau === 0) {
$this->pdo->beginTransaction();
}
$this->niveau++;
}
public function valider(): void {
$this->niveau--;
if ($this->niveau === 0) {
$this->pdo->commit();
}
}
public function annuler(): void {
$this->niveau = 0;
$this->pdo->rollBack();
}
}
Ressources
- Transactions PDO — Guide officiel sur les transactions PDO
📘 Cette leçon fait partie du cours PHP Essentials sur la plateforme d’apprentissage RostoDev.
Prêt à passer à la suite ?
Vous avez terminé cette leçon sur Transactions de Base de Données. Continuez votre apprentissage avec la prochaine leçon ou explorez d'autres formations.