Transaction

Une transaction est un ensemble d’opérations qui sont traitées comme une seule unité pour une base de données. Si une opération échoue, toutes les opérations de la transaction sont annulées.

Elles regroupe un ensemble de requêtes SQL qui doivent être exécutées de manière cohérente et intégrale.

Elle garantit que toutes les opérations qu’elle contient sont soit toutes exécutées avec succès, soit toutes annulées en cas d’erreur.

Les transactions sont utiles pour maintenir la cohérence et l’intégrité des données dans la base de données, en s’assurant que les modifications apportées aux données sont valides et cohérentes.

Elles sont généralement suivis par une séquence d’instructions : BEGIN (ou START), COMMIT (ou END), et ROLLBACK. BEGIN.

2 façons d’implémenter les transactions

Les transactions par le code sont implémentées dans le code de l’application. Elles offrent un niveau d’abstraction plus élevé, car elles permettent de contrôler les transactions de manière globale.

Les transactions SQL sont implémentées dans la base de données. Elles offrent un niveau d’abstraction plus bas, car elles ne permettent de contrôler les transactions que pour une requête SQL donnée.

Exemple d’utilisation des transactions

  • Pour transférer de l’argent d’un compte à un autre.
  • Pour créer un nouveau dossier et y ajouter des fichiers.
  • Pour réserver un billet d’avion et payer pour celui-ci.

Exemples de transaction SQL simple

BEGIN TRANSACTION;

UPDATE users SET name = 'Jane Doe' WHERE id = 1;

UPDATE orders SET status = 'completed' WHERE user_id = 1;

COMMIT TRANSACTION;
-- Début de la transaction
START TRANSACTION;

-- Étape 1 : Insérer une nouvelle commande
INSERT INTO commandes (client_id, date_commande)
VALUES (1, NOW()); -- Supposons que le client avec l'ID 1 effectue la commande

-- Obtenez l'ID de la commande nouvellement insérée
SET @nouvelle_commande_id = LAST_INSERT_ID();

-- Étape 2 : Mettre à jour les quantités de produits
UPDATE produits
SET stock = stock - (
    SELECT quantite
    FROM details_commande
    WHERE commande_id = @nouvelle_commande_id
      AND produits.produit_id = details_commande.produit_id
)
WHERE EXISTS (
    SELECT *
    FROM details_commande
    WHERE commande_id = @nouvelle_commande_id
      AND produits.produit_id = details_commande.produit_id
);

-- Si tout s'est bien passé, valider la transaction
COMMIT;

-- Si une erreur s'est produite, annuler la transaction
-- ROLLBACK;

Exemple d’une requête avec transaction sur Symfony

Pour démarrer une transaction, il suffit d’appeler la méthode beginTransaction() de la classe Doctrine\DBAL\Connection.

// Démarrage d'une transaction
$connection->beginTransaction();

// Exécution de la première requête
$statement1 = $connection->prepare('UPDATE users SET name = ? WHERE id = ?');
$statement1->execute(['John Doe', 1]);

// Exécution de la deuxième requête
$statement2 = $connection->prepare('UPDATE orders SET status = ? WHERE user_id = ?');
$statement2->execute(['completed', 1]);

// Vérification de l'erreur
if ($error) {
    // Annulation de la transaction
    $connection->rollback();
} else {
    // Commit de la transaction validation de transaction en base de données
    $connection->commit();
}

Exemple de transaction avec la couche d’abstraction ORM Doctrine Symfony DBAL

// Démarrage d'une transaction
$connection->beginTransaction();

// Exécution d'une requête
$statement = $connection->prepare('UPDATE users SET name = ? WHERE id = ?');
$statement->execute(['Jane Doe', 1]);

// Commit de la transaction
$connection->commit();