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:c04 [2025/10/01 08:56] – [Présentation] dthevenot | d4:c04 [2025/10/02 16:20] (Version actuelle) – dthevenot | ||
---|---|---|---|
Ligne 62: | Ligne 62: | ||
Dans phpMyadmin → Journal binaire | Dans phpMyadmin → Journal binaire | ||
===== Support des transactions ===== | ===== Support des transactions ===== | ||
- | Il n'est pas possible d' | + | Il n'est pas possible d' |
Il existe différents moteurs de stockage possibles avec MySQL, dont les plus connus sont MyISAM et InnoDB. | Il existe différents moteurs de stockage possibles avec MySQL, dont les plus connus sont MyISAM et InnoDB. | ||
Nous n’avons utilisé que des tables créées avec le moteur InnoDB, ce qui tombe plutôt bien car en effet | Nous n’avons utilisé que des tables créées avec le moteur InnoDB, ce qui tombe plutôt bien car en effet | ||
: | : | ||
- | * les tables MyISAM sont non transactionnelles, | + | * les tables |
- | * les tables InnoDB sont transactionnelles, | + | * les tables |
| | ||
- | ===== Syntaxe et utilisation ===== | + | ===== Validation |
- | + | ||
- | ==== Vocabulaire ==== | + | |
- | + | ||
- | Lorsque l'on valide les requêtes d'une transaction, | + | |
- | ==== Comportement par défaut ==== | + | |
- | + | ||
- | Vous l' | + | |
- | Pour quitter ce mode, il suffit de lancer la requête suivante : | + | |
- | + | ||
- | < | + | |
- | + | ||
- | Une fois que vous n' | + | |
- | + | ||
- | Tant que vos modifications ne sont pas validées, vous pouvez à tout moment les annuler (faire un rollback). | + | |
- | + | ||
- | < | + | |
- | ==== Commandes essentielles ==== | + | |
- | < | + | |
- | * START TRANSACTION; | + | |
- | * COMMIT; → valide les modifications | + | |
- | * ROLLBACK; → annule les modifications | + | |
- | * SAVEPOINT nom; → crée un point intermédiaire | + | |
- | * ROLLBACK TO nom; → annule seulement jusqu’au point donné | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | ===== D4-A05 : Application des transactions sur la base de données Biblio ===== | + | |
- | + | ||
- | ==== 1) Validation/annulation de requêtes ==== | + | |
- | + | ||
- | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | + | |
- | < | + | |
- | SET autocommit=0; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | </ | + | |
- | < | + | |
- | + | ||
- | 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(' | + | |
- | Commit ; | + | |
- | </ | + | |
- | < | + | |
- | + | ||
- | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | + | |
- | < | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | SELECT * FROM genre; | + | |
- | </ | + | |
- | < | + | |
- | + | ||
- | < | + | |
- | + | ||
- | ==== 2) Visibilité des changements non commités. ==== | + | |
- | + | ||
- | Exécuter les requêtes suivantes dans une même fenêtre d’exécution : | + | |
- | < | + | |
- | SET autocommit=0; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | SELECT * FROM genre ; | + | |
- | </ | + | |
- | Ensuite, tout en laissant ce client MySQL ouvert, ouvrez-en un deuxième. Connectez-vous comme d' | + | |
- | + | ||
- | < | + | |
- | + | ||
- | La table genre n’a pas changé. Les changements non commités ne sont donc pas visibles à l' | + | |
- | + | ||
- | ==== Démarrer explicitement une transaction ==== | + | |
- | + | ||
- | En désactivant le mode autocommit, en réalité, on démarre une transaction. Et chaque fois que l'on fait un rollback ou un commit (ce qui met fin à la transaction), | + | |
- | + | ||
- | Il est également possible de démarrer explicitement une transaction, | + | |
- | + | ||
- | Nous sommes toujours en mode autocommit activé, pour démarrer une transaction, | + | |
- | < | + | |
- | + | ||
- | Avec MySQL, il est également possible de démarrer une transaction avec BEGIN ou BEGIN WORK. Cependant, il est conseillé d' | + | |
- | + | ||
- | Une fois la transaction ouverte, les requêtes devront être validées pour prendre effet. Attention au fait qu'un COMMIT ou un ROLLBACK met fin automatiquement à la transaction, | + | |
- | + | ||
- | === Exemples de transactions en mode autocommit (à exécuter en 1 fois) : === | + | |
- | < | + | |
- | start transaction; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | SELECT * FROM genre; | + | |
- | </ | + | |
- | + | ||
- | < | + | |
- | * Comparez les 2 résultats des « SELECT * ». Que constatez-vous ? Expliquez ce résultat. | + | |
- | * En utilisant la transaction, | + | |
- | </ | + | |
- | + | ||
- | ==== Jalon de transaction ==== | + | |
- | + | ||
- | Lorsque l'on travaille dans une transaction et que l'on constate que certaines requêtes posent problème, on n'a pas toujours envie de faire un rollback depuis le début de la transaction, | + | |
- | + | ||
- | === Syntaxe === | + | |
- | + | ||
- | Trois nouvelles commandes suffisent pour pouvoir utiliser pleinement les jalons : | + | |
- | < | + | |
- | SAVEPOINT nom_jalon; | + | |
- | -- Crée un jalon avec comme nom " | + | |
- | ROLLBACK [WORK] TO [SAVEPOINT] nom_jalon; | + | |
- | -- Annule les requêtes exécutées depuis le jalon " | + | |
- | RELEASE SAVEPOINT nom_jalon; | + | |
- | -- Retire le jalon " | + | |
- | </ | + | |
- | + | ||
- | __Exemple :__ exécutez les requêtes suivantes en 1 fois. | + | |
- | < | + | |
- | START TRANSACTION; | + | |
- | insert into genre (nomGenre) values(' | + | |
- | insert into genre (nomGenre) values(' | + | |
- | insert into genre (nomGenre) values(' | + | |
- | COMMIT; | + | |
- | </ | + | |
- | + | ||
- | On n' | + | |
- | + | ||
- | ==== autres exercices ==== | + | |
- | Ces exercices permettent de manipuler les transactions dans des cas concrets. | + | |
- | * Exercice 1 : Insérer un nouveau genre de livre | + | |
- | Table : genre(idGenre, | + | |
- | - 1. SET autocommit=0; | + | |
- | - 2. INSERT INTO genre (nomGenre) VALUES(' | + | |
- | - 3. Vérifiez le contenu de la table avant COMMIT puis après COMMIT. | + | |
- | + | ||
- | Correction Exercice 1 | + | |
- | < | + | |
- | 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). | + | |
- | - Effectuer un transfert de 200 € du compte A vers le compte B avec une transaction. | + | |
- | - Si une mise à jour échoue, tout doit être annulé. | + | |
- | + | ||
- | 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 | + | |
- | < | + | |
- | START TRANSACTION; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | SAVEPOINT s1; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | ROLLBACK TO s1; | + | |
- | INSERT INTO genre (nomGenre) VALUES(' | + | |
- | 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, | Vous savez déjà que, pour terminer une transaction, | ||
Ligne 248: | Ligne 77: | ||
Par ailleurs, ces commandes ne peuvent pas être annulées par un ROLLBACK. | Par ailleurs, ces commandes ne peuvent pas être annulées par un ROLLBACK. | ||
- | == Commandes DDL == | + | ==== 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. | 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. | ||
Ligne 258: | Ligne 87: | ||
* 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. | * 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 == | + | ==== Utilisateurs |
La création, la modification et la suppression d' | La création, la modification et la suppression d' | ||
- | === Transactions | + | ===== Syntaxe |
- | Il n’est pas possible d'imbriquer des transactions, | + | ==== Vocabulaire ==== |
+ | |||
+ | Lorsque l'on valide les requêtes | ||
+ | ==== Comportement par défaut ==== | ||
+ | |||
+ | Par défaut, MySQL ne travaille pas avec les transactions. Chaque requête effectuée est directement commitée (validée). On ne peut pas revenir en arrière. On peut donc considérer que chaque requête constitue | ||
+ | Pour quitter ce mode, il suffit de lancer la requête suivante : | ||
- | Le fait d' | + | < |
- | La création et suppression de verrous de table clôturent aussi une transaction | + | Une fois que vous n' |
- | === Chargement de données === | + | |
+ | Tant que vos modifications ne sont pas validées, vous pouvez à tout moment les annuler | ||
- | Enfin, le chargement | + | < |
- | < | + | [[d4:A05]] |
- | 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. | + | |
- | * Tous les changements de données (insertion, suppression, | + | |
- | * Les transactions permettent d' | + | |
- | * Certaines commandes SQL provoquent une validation implicite des transactions, | + | |
- | * Les critères ACID sont les critères qu'un système appliquant les transactions doit respecter pour être fiable | + | |
- | </ | + | |