Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
d4:a05 [2025/10/01 14:29] – [Démarrer explicitement une transaction] dthevenot | d4:a05 [2025/10/01 14:52] (Version actuelle) – [Exercices d'application] dthevenot | ||
---|---|---|---|
Ligne 4: | Ligne 4: | ||
Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | ||
- | < | + | < |
- | SET autocommit=0; | + | |
INSERT INTO genre (nomGenre) VALUES(' | INSERT INTO genre (nomGenre) VALUES(' | ||
</ | </ | ||
Ligne 11: | Ligne 10: | ||
Maintenant exécuter les 3 requêtes suivantes dans une même fenêtre d’exécution : | Maintenant exécuter les 3 requêtes suivantes dans une même fenêtre d’exécution : | ||
- | < | + | < |
- | SET autocommit=0; | + | |
INSERT INTO genre (nomGenre) VALUES(' | INSERT INTO genre (nomGenre) VALUES(' | ||
Commit ; | Commit ; | ||
Ligne 19: | Ligne 17: | ||
Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | ||
- | < | + | < |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
SELECT * FROM genre; | SELECT * FROM genre; | ||
</ | </ | ||
Ligne 30: | Ligne 27: | ||
Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | ||
- | < | + | < |
- | SET autocommit=0; | + | |
INSERT INTO genre (nomGenre) VALUES(' | INSERT INTO genre (nomGenre) VALUES(' | ||
SELECT * FROM genre ; | SELECT * FROM genre ; | ||
Ligne 60: | Ligne 56: | ||
| | ||
=== Exemples de transactions en mode autocommit (à exécuter en 1 fois) : === | === Exemples de transactions en mode autocommit (à exécuter en 1 fois) : === | ||
- | < | + | < |
- | START TRANSACTION; | + | |
INSERT INTO genre (nomGenre) VALUES(' | INSERT INTO genre (nomGenre) VALUES(' | ||
SELECT * FROM genre; | SELECT * FROM genre; | ||
Ligne 69: | Ligne 64: | ||
< | < | ||
- | | + | |
- | | + | |
</ | </ | ||
Ligne 79: | Ligne 74: | ||
=== Syntaxe === | === Syntaxe === | ||
- | Trois nouvelles commandes suffisent pour pouvoir utiliser pleinement les jalons : | + | Trois nouvelles commandes suffisent pour pouvoir utiliser pleinement les jalons, voici la **SYNTAXE** |
- | < | + | < |
- | SAVEPOINT nom_jalon; | + | |
-- Crée un jalon avec comme nom " | -- Crée un jalon avec comme nom " | ||
ROLLBACK [WORK] TO [SAVEPOINT] nom_jalon; | ROLLBACK [WORK] TO [SAVEPOINT] nom_jalon; | ||
Ligne 90: | Ligne 84: | ||
__Exemple :__ exécutez les requêtes suivantes en 1 fois. | __Exemple :__ exécutez les requêtes suivantes en 1 fois. | ||
- | < | + | < |
- | START TRANSACTION; | + | insert into genre (nomGenre) values(' |
- | insert into genre (nomGenre) values(' | + | SAVEPOINT jalon1; |
- | insert into genre (nomGenre) values(' | + | insert into genre (nomGenre) values(' |
+ | ROLLBACK TO SAVEPOINT jalon1; | ||
insert into genre (nomGenre) values(' | insert into genre (nomGenre) values(' | ||
COMMIT; | COMMIT; | ||
</ | </ | ||
- | On n' | + | < |
- | + | On n' | |
- | ==== autres exercices | + | ==== Exercices d' |
- | Ces exercices permettent de manipuler | + | === Objectifs === |
- | * Exercice 1 : Insérer un nouveau genre de livre | + | - Mettre en œuvre |
- | Table : genre(idGenre, | + | - Manipuler |
- | - 1. SET autocommit=0; | + | === Exercice 1 : gestion de comptes bancaires === |
- | - 2. INSERT INTO genre (nomGenre) VALUES(' | + | |
- | - 3. Vérifiez le contenu de la table avant COMMIT puis après | + | |
- | + | ||
- | Correction | + | |
- | < | + | |
- | SET autocommit=0; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | SELECT * FROM genre; -- L’enregistrement n’est pas encore visible après fermeture de session | + | |
- | COMMIT; -- Rend le changement définitif | + | |
- | </ | + | |
- | + | ||
- | * Exercice 2 : Transfert bancaire | + | |
- Créer une table compte(id, nom, solde). | - Créer une table compte(id, nom, solde). | ||
- | - Effectuer | + | - Insérer quelques comptes. |
- | | + | - Ecrire les commandes SQL pour effectuer |
+ | == Utilisation de SAVEPOINT == | ||
+ | - Effectuer des transferts multiples avec un rollback partiel. | ||
+ | == Concurrence == | ||
+ | - Simuler deux sessions MariaDB (deux terminaux). | ||
+ | - Montrer l’effet d’un COMMIT tardif sur les lectures concurrentes. | ||
- | Correction Exercice 2 | ||
- | < | ||
- | START TRANSACTION; | ||
- | UPDATE compte SET solde = solde - 200 WHERE id = 1; | ||
- | UPDATE compte SET solde = solde + 200 WHERE id = 2; | ||
- | COMMIT; | ||
- | -- Si problème : ROLLBACK; | ||
- | </ | ||
- | * Exercice 3 : SAVEPOINT | ||
- | - Créer plusieurs insertions dans une table avec un SAVEPOINT. | ||
- | - Annuler seulement une partie des requêtes. | ||
- | Correction Exercice 3 | + | ==== Commandes essentielles |
- | < | + | < |
- | START TRANSACTION; | + | * START TRANSACTION; → démarre une transaction |
- | INSERT INTO genre (nomGenre) VALUES(' | + | * COMMIT; → valide les modifications |
- | SAVEPOINT s1; | + | * ROLLBACK; → annule les modifications |
- | INSERT INTO genre (nomGenre) VALUES(' | + | * SAVEPOINT nom; → crée un point intermédiaire |
- | ROLLBACK TO s1; | + | * ROLLBACK TO nom; → annule seulement jusqu’au point donné |
- | INSERT INTO genre (nomGenre) VALUES(' | + | </bootnote> |
- | COMMIT; | + | |
- | </ | + | |
- | * Exercice 4 : Concurrence | + | |
- | Ouvrir deux sessions MariaDB : | + | |
- | * - Dans la première, insérer un enregistrement sans COMMIT. | + | |
- | * - Dans la deuxième, vérifier que l’insertion n’est pas visible. | + | |
- | + | ||
- | < | + | |
- | === Validation implicite et commandes non annulables | + | |
- | + | ||
- | Vous savez déjà que, pour terminer une transaction, | + | |
- | + | ||
- | Ça, c'est la manière classique et recommandée. Mais il faut savoir qu'un certain nombre d' | + | |
- | + | ||
- | Par ailleurs, ces commandes ne peuvent pas être annulées par un ROLLBACK. | + | |
- | + | ||
- | == Commandes DDL == | + | |
- | + | ||
- | Toutes les commandes qui créent, modifient, suppriment des objets dans la base de données valident implicitement les transactions. Ces commandes forment ce que l'on appelle les requêtes DDL, pour Data Definition Langage. | + | |
- | Cela comprend donc : | + | |
- | * La création et suppression de bases de données : CREATE DATABASE, DROP DATABASE | + | |
- | * La création, modification, | + | |
- | * La création, modification, | + | |
- | * La création d' | + | |
- | * De manière générale, tout ce qui influe sur la structure de la base de données, et non sur les données elles-mêmes. | + | |
- | + | ||
- | == Utilisateurs == | + | |
- | + | ||
- | La création, la modification et la suppression d' | + | |
- | + | ||
- | === Transactions et verrous === | + | |
- | + | ||
- | Il n’est pas possible d' | + | |
- | + | ||
- | Le fait d' | + | |
- | + | ||
- | La création et suppression de verrous de table clôturent aussi une transaction en la validant implicitement (voir partie suivante). | + | |
- | === Chargement de données === | + | |
- | + | ||
- | Enfin, le chargement de données avec LOAD DATA provoque également une validation implicite.</del> | + | |
+ | ==== A retenir ==== | ||
< | < | ||
- | En résumé | ||
* Les transactions permettent de grouper plusieurs requêtes, lesquelles seront validées (COMMIT) ou annulées (ROLLBACK) toutes en même temps. | * Les transactions permettent de grouper plusieurs requêtes, lesquelles seront validées (COMMIT) ou annulées (ROLLBACK) toutes en même temps. | ||
* Tous les changements de données (insertion, suppression, | * Tous les changements de données (insertion, suppression, | ||
Ligne 191: | Ligne 128: | ||
* Les critères ACID sont les critères qu'un système appliquant les transactions doit respecter pour être fiable : Atomicité, Cohérence, Isolation, Durabilité. | * Les critères ACID sont les critères qu'un système appliquant les transactions doit respecter pour être fiable : Atomicité, Cohérence, Isolation, Durabilité. | ||
</ | </ | ||
- |