Dans les volets précédents, nous avons vu ce que sont les transactions, leurs propriétés (ACID), et pourquoi elles sont essentielles pour garantir l'intégrité de nos données.
Passons maintenant à la pratique avec une implémentation des transactions dans trois systèmes de bases de données courants :
- ✅ MySQL
- ✅ PostgreSQL
- ✅ SQL Server
Nous allons également voir comment cela se traduit dans une application Laravel à travers Eloquent ou le Query Builder.
🔄 Rappel : Que fait une transaction ?
Une transaction permet d’exécuter plusieurs opérations comme une seule unité de travail.
Si l’une échoue, toutes les autres sont annulées (rollback). Si tout réussit, elles sont validées (commit).
⚙️ Syntaxe SQL brute pour les transactions
🟢 MySQL & PostgreSQL
START TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1;UPDATE accounts SET balance = balance + 100 WHERE id = 2;COMMIT;
En cas d’erreur : remplacer COMMIT; par ROLLBACK;
✅ Note : Pour PostgreSQL, BEGIN peut aussi être utilisé
🔵 SQL Server (T-SQL)
BEGIN TRANSACTION; UPDATE accounts SET balance = balance - 100 WHERE id = 1;UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT TRANSACTION;
⚠️ Si une erreur survient, exécuter ROLLBACK TRANSACTION;
🧑💻 Équivalent Laravel avec le Query Builder
Exemple : Transférer de l'argent entre deux comptes
use Illuminate\Support\Facades\DB; DB::transaction(function () { DB::table('accounts')->where('id', 1)->decrement('balance', 100); DB::table('accounts')->where('id', 2)->increment('balance', 100);});
🧠 Laravel gère automatiquement le commit si tout passe et le rollback si une exception est levée.
🧱 Exemple complet avec gestion d’exception
use Illuminate\Support\Facades\DB;use Throwable; try { DB::beginTransaction(); DB::table('accounts')->where('id', 1)->decrement('balance', 100); DB::table('accounts')->where('id', 2)->increment('balance', 100); DB::commit();} catch (Throwable $e) { DB::rollBack(); // Log l'erreur ou notifier throw $e;}
✅ Cette méthode est utile quand on veut gérer les erreurs ou faire du logging personnalisé.
📦 Exemple avec Eloquent
Imaginons deux modèles Account :
DB::transaction(function () { $sender = Account::find(1); $receiver = Account::find(2); $sender->balance -= 100; $receiver->balance += 100; $sender->save(); $receiver->save();});
Eloquent + transactions = 🧠 Puissance + sécurité
💡 Bonnes pratiques à retenir
🔹 Toujours encapsuler plusieurs écritures liées dans une transaction 🔹 Ne pas laisser de logique métier lourde entre begin et commit 🔹 Gérer proprement les exceptions 🔹 Éviter les requêtes longues pour ne pas verrouiller la base trop longtemps 🔹 Tester les rollbacks dans vos tests automatisés
✅ Conclusion
Que vous utilisiez MySQL, PostgreSQL ou SQL Server, les principes sont les mêmes :
- Démarrer la transaction
- Exécuter vos opérations critiques
- Commit si tout passe, rollback sinon
Laravel vous offre une interface propre et expressive pour gérer tout cela en toute sécurité.