From 4073a7ef6b97386d86b3b3688c7f6b115a76d0b8 Mon Sep 17 00:00:00 2001 From: 0h My Goat Date: Mon, 13 Nov 2023 20:03:33 +0100 Subject: [PATCH] feat: transactions :sparkles: --- README.md | 2 +- cours/00_index.slides.md | 4 +- cours/06_transactions.slides.md | 231 ++++++++++++++++++++++++++++++++ cours/assets/transaction.png | Bin 0 -> 26498 bytes 4 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 cours/06_transactions.slides.md create mode 100644 cours/assets/transaction.png diff --git a/README.md b/README.md index 5b64c41..098ffa2 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Pour chaque exercice, vous retrouverez trois niveaux de difficulté : - [x] [Fonctions](/cours/04_fonctions.slides.md) - [x] [Sous requêtes](/cours/05_sous-requetes.slides.md) - [ ] [Conception d'une BDD]() -- [ ] [Transactions]() +- [x] [Transactions](/cours/06_transactions.slides.md) - [ ] [Procédures stockées et Triggers]() ## Ressources 👜 diff --git a/cours/00_index.slides.md b/cours/00_index.slides.md index 17fcf25..934f387 100644 --- a/cours/00_index.slides.md +++ b/cours/00_index.slides.md @@ -12,4 +12,6 @@ contributors: - [Présentation](01_presentation.slides.html) - [Création et commandes de base](02_creation-bdd.slides.html) - [Jointures](03_jointures.slides.html) -- [Vues et fonctions](04_vues-et-fonctions.slides.html) \ No newline at end of file +- [Vues et fonctions](04_vues-et-fonctions.slides.html) +- [Sous-requêtes](05_sous-requetes.slides.html) +- [Transactions](06_transactions.slides.html) \ No newline at end of file diff --git a/cours/06_transactions.slides.md b/cours/06_transactions.slides.md new file mode 100644 index 0000000..8576b1e --- /dev/null +++ b/cours/06_transactions.slides.md @@ -0,0 +1,231 @@ +--- +title: Transactions +theme: solarized +author: Alexandre Devos +company: Octocorn +contributors: + - Alexandre Devos +--- + +# SQL : Transactions + +![SQL](./assets/sql.png) + +![MySQL](./assets/mysql.png) + +---- + +## Transactions + +### Définition + +- Une transaction est une suite d'opérations qui doit être exécutée dans son intégralité ou pas du tout. + +- L'idée étant de tout annuler si une des étapes échoue. + +---- + +## Transactions + +### Exemple + +Si je veux réaliser un virement bancaire, il faut : +1. Vérifier que j'ai assez d'argent sur mon compte +2. Débiter mon compte +3. Créditer le compte du bénéficiaire + +> Que se passerait-il en cas de coupure de courant entre l'étape 2 et 3 ? + +---- + +## Transactions + +### Exemple + +- Je serais débité mais le bénéficiaire ne serait pas crédité. + +> Où est l'argent ?! + +---- + +## Transactions + +### Solution + +- Les transactions sont là pour résoudre ce genre de problèmes + +- On va réaliser les trois étapes sans les valider + +- Si tout se passe bien, on valide la transaction + +- Sinon, on annule toutes les opérations + +---- + +## Transactions + +### En image + +![Transaction](assets/transaction.png) + +---- + +## Transactions + +### Les commits + +- Comme pour Git, un `COMMIT` valide les opérations + +- Sur un script SQL, il commit automatiquement à la fin du script + +```mysql +-- Désactiver les autocommits +SET AUTOCOMMIT = 0; +``` + +> Les données sont tout de même présentes dans la base de données, mais elles ne sont pas validées + +---- + +## Transactions + +### Les Rollbacks + +- `ROLLBACK` annule les opérations qui n'ont pas été commités + +- On peut rollback une transaction en cours + +- On peut rollback un script SQL + +```mysql +-- Annuler les opérations +ROLLBACK; +``` + +---- + +## Transactions + +### Petit test + +Ajoutons un article dans la table `eleves`: + +```mysql +INSERT INTO eleves (nom, prenom, date_naissance) +VALUES ('Devos', 'Alexandre', '1992-07-20') +``` + +Vérifions : + +```mysql +SELECT * FROM eleves; +ROLLBACK; +SELECT * FROM eleves; +``` + +---- + +## Transactions + +### ROLLBACK + +- Finalement, un rollback est un `ctrl + z` sur la base de données. + +- Il remet la BDD tel qu'elle était eu dernier commit ! + +> Quel serait la commande Git équivalente ? + +Note: `git stash` + +---- + +## Transactions + +### Essayons de valider + +```mysql +INSERT INTO eleves (nom, prenom, date_naissance) +VALUES ('Devos', 'Alexandre', '1992-07-20'); +COMMIT; +ROLLBACK; +``` + +---- + +## Avant de passer à la suite + +Pensez à réactiver les autocommits : + +```mysql +SET AUTOCOMMIT = 1; +``` + +--- + +## Transactions + +### Les transactions en SQL + +- Plutôt que de désactiver les autocommits, on peut utiliser les transactions + +- Cela évite d'oublier de les réactiver ! + +- On termine une transaction avec `COMMIT` ou `ROLLBACK` + +```mysql +START TRANSACTION; +-- Requêtes +COMMIT; +``` + +---- + +## Transactions + +### Les savepoints + +- On peut créer des points de sauvegarde dans une transaction + +- On peut revenir à un savepoint avec `ROLLBACK TO` + +```mysql +START TRANSACTION; +-- Requêtes +SAVEPOINT savepoint1; +-- Requêtes +SAVEPOINT savepoint2; +-- Requêtes +ROLLBACK TO savepoint1; +-- Requêtes +COMMIT; +``` + +---- + +## Transactions + +### Validations implicites + +Certains éléments valident automatiquement une transaction : +- `CREATE TABLE`, `DROP TABLE`, +- `CREATE INDEX`, `DROP INDEX`, +- `ALTER TABLE`, `RENAME TABLE`, +- `TRUNCATE TABLE`, `LOCK TABLES`, `UNLOCK TABLES` + +> Globalement, tout ce qui influe sur la structure de la base de données ! + +---- + +## Transactions + +### Validations implicites + +- Il n'est pas possible de créer une transaction dans une transaction + +- En réalité `START TRANSACTION` commite la transaction en cours avant d'en créer une nouvelle ! + +--- + +## Retour à l'index + +[Index](index.html) \ No newline at end of file diff --git a/cours/assets/transaction.png b/cours/assets/transaction.png new file mode 100644 index 0000000000000000000000000000000000000000..e73f75f95297074d56a633c9d84c01cae15766c5 GIT binary patch literal 26498 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

fIxDEMLox6AG!ZGP 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 f3iz)YD?S$Gw2`gdd