2 min de lecture
1 vues

Transactions en base de données : Implémentation pratique avec MySQL, PostgreSQL et SQL Server

Transactions en base de données : Implémentation pratique avec MySQL, PostgreSQL et SQL Server

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é.