Skip to content

Commit

Permalink
feat: transactions ✨
Browse files Browse the repository at this point in the history
  • Loading branch information
0h My Goat committed Nov 13, 2023
1 parent fa7ec2b commit 4073a7e
Show file tree
Hide file tree
Showing 4 changed files with 235 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 👜
Expand Down
4 changes: 3 additions & 1 deletion cours/00_index.slides.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
- [Vues et fonctions](04_vues-et-fonctions.slides.html)
- [Sous-requêtes](05_sous-requetes.slides.html)
- [Transactions](06_transactions.slides.html)
231 changes: 231 additions & 0 deletions cours/06_transactions.slides.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
---
title: Transactions
theme: solarized
author: Alexandre Devos
company: Octocorn
contributors:
- Alexandre Devos
---

# SQL : Transactions

![SQL](./assets/sql.png) <!-- .element width="30%" align="left" -->

![MySQL](./assets/mysql.png) <!-- .element width="30%" align="right" -->

----

## 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)
Binary file added cours/assets/transaction.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 4073a7e

Please sign in to comment.