Transaction

Vous êtes ici : >> SQL / Transaction
Temps d'étude : 30 min. Niveau : Moyen.
Tags : Base de données, cours sql, Transaction
Fichier(s) utile(s) pour ce cours : employes.sql

Les transactions

Lorsque nous utilisons des requêtes d'action qui impactent les données (type INSERT, UPDATE, DELETE), habituellement il n'est pas possible de faire marche arrière.

Faire une erreur peut arriver à tout le monde. Le moteur de stockage InnoDB propose une option d'annulation / confirmation des requêtes.

SQL / Transaction
	START TRANSACTION;
	SELECT * FROM employes;
	UPDATE employes SET salaire = 123 WHERE id_employes = 699;
	SELECT * FROM employes;
	ROLLBACK; -- ou COMMIT;
	
START TRANSACTION permet de démarrer une zone de requête sous réserve de confirmation / annulation.

Si nous souhaitons annuler nos requêtes, il nous suffira d'inscrire : ROLLBACK;

Au contraire, si nous souhaitons confirmer nos requêtes, il nous faudra inscrire : COMMIT;

Que l'on choisisse ROLLBACK ou COMMIT, cela TERMINE la transaction, ça veut dire que les prochaines requêtes ne pourront pas être annulées, à moins de remettre un START TRANSACTION.

fléche Attention
Si vous ne choisissez ni ROLLBACK ni COMMIT, ce sera ROLLBACK qui s'appliquera par défaut.


Pensez donc à valider si toutes vos requêtes sont bonnes.

Autre cas, si vous avez une transaction avec 5 requêtes : 2 bonnes, 1 mauvaise, 2 bonnes.
Vous voudrez certainement annuler la mauvaise requête mais le ROLLBACK va s'appliquer sur l'ensemble et annuler également les bonnes requêtes.

Pour cette raison il existe les transactions avancées que nous verrons au prochain chapitre.

Transaction Avancée

Les transactions avancées permettent de créer des points de restauration.

SQL / Transaction
	START TRANSACTION;

	SELECT * FROM employes;
	SAVEPOINT point1;

	UPDATE employes SET salaire = 1500 WHERE id_employes = 699;
	SELECT * FROM employes;
	SAVEPOINT point2;

	UPDATE employes SET salaire = 2300 WHERE id_employes = 699;
	SELECT * FROM employes;
	SAVEPOINT point3;

	UPDATE employes SET salaire = 1400 WHERE id_employes = 699;
	SELECT * FROM employes;
	SAVEPOINT point4;

	ROLLBACK to point3; -- retour au point3
	SELECT * FROM employes;
	ROLLBACK to point4; -- ERREUR
	ROLLBACK to point1; -- retour au point1

	COMMIT; -- Valide et termine la transaction.
	
SAVEPOINT permet de créer un point de restauration sur lequel nous pourrons revenir plus tard.

S'il y a 10 points de restauration, je peux revenir au 6e puis ensuite au 3e

Je ne peux pas revenir au 3e et ensuite revenir au 6e (les points doivent être antérieur à l'instant où l'on se trouve).