diff --git a/DB Implementation/TD/TD1.md b/DB Implementation/TD/TD1.md new file mode 100644 index 0000000000000000000000000000000000000000..5db7e1ebf0bc8a7ca7a9a6c15b50a3935e2948be --- /dev/null +++ b/DB Implementation/TD/TD1.md @@ -0,0 +1,372 @@ +--- +author: Robin VAN DE MERGHEL +date: 2023 +title: Bases de données +lang: fr +geometry: margin=2cm +--- + +# Cours magistral 1 + +- Histoire des bases de données (du FBI à IBM) +- Introduction sur les bases de données relationnelles + - Les contraintes + - Les contraintes d'intégrité + - Les contraintes implicites +- TD 1 (wtf) + +## TD1 + +### Exercice 1 + +On va considérer 3 tables : `Conference`, `Specialite` et `AnneeConf` : + +```plantuml +@startuml +!define primary_key(x) <b><color:#b8861b><&key></color> x</b> +!define foreign_key(x) <color:#aaaaaa><&key></color> x +!define column(x) <color:#efefef><&media-record></color> x +!define table(x) entity x << (T, white) >> + +table( conference ) { + primary_key( idConf ) : int + column( sigle ) : varchar + column( nomConf ) : varchar + column( porteeConf ) : varchar + foreign_key( idSpé ) : int +} + +table( specialite ) { + primary_key( idSpé ) : int + column( libelle ) : varchar +} + +table( anneeConf ) { + primary_key( annee ) : int + foreign_key( idConf ) : int + column( ville ) : varchar + column( pays ) : varchar +} + +conference <- anneeConf +specialite <- conference + +@enduml +``` + +#### Question 1 et 2 + +> **Donner les super-clés des tables `Spécialité`, et `AnneeConf`.** + +Les super-clés de `Specialite` sont : + +- `idSpé` (car c'est la clé primaire) +- `idSpé` + `libelle` + +Les super-clés de `AnneeConf` sont : + +- `annee` et `idConf` (car c'est la clé primaire) +- `idConf`, `annee` et `ville` +- `idConf`, `annee`, `ville` et `pays` + + +#### Question 3 + +> **On va considérer que la base de donnée est remplie comme suit :** + + +> | idSpé | libelle | +> |-------|---------| +> | 0 | DB | + + +> | idConf | sigle | nomConf | porteeConf | idSpé | +> |--------|-------|---------|------------|-------| +> | 0 | BDA | BD annuelle | France | 0 | + +> | idConf | annee | ville | pays | +> |--------|-------|-------|------| +> | 0 | 2022 | Clermont-Ferrand | France | + + +> **Donner les clés étrangères de ces 3 tables (`Specialite`, `Conference` et `AnneeConf`).** + +- `idConf` est une clé étrangère de `AnneeConf`, elle référence `idConf` de `Conference` +- `idSpé` est une clé étrangère de `Conference`, elle référence `idSpé` de `Specialite` +- `Specialite` n'a pas de clé étrangère, car elle n'en référence pas d'autres + +En effet on le voit sur le schéma suivant : + +```mermaid +graph LR + AnneeConf --> Conference + Conference --> Specialite +``` + +##### Question 4.1 + +> **Que se passe-t-il avec : `INSERT INTO Specialite VALUES (0, 'maths')` ?** + +Il y a une erreur car la contrainte de clé primaire est violée par cette insertion. + +##### Question 4.2 + +> **Que se passe-t-il avec : `INSERT INTO AnneConf VALUES (0, 2021, `Paris`, `France`)` ?** + +La clé primaire n'est pas violée (la clé est `idConf` + `annee`). Donc l'insertion est possible. + +On obtient donc : + +> | idConf | annee | ville | pays | +> |--------|-------|-------|------| +> | 0 | 2022 | Clermont-Ferrand | France | +> | 0 | 2021 | Paris | France | + +##### Question 4.3 + +> **Que se passe-t-il avec : `INSERT INTO AnneConf VALUES (1, 2022, `Sydney`, `Australie`)` ?** + +L'insertion viole la clé étrangère de la table `AnneeConf` car il n'y a pas de `idConf` = 1 dans la table `Conference`. + +##### Question 4.4 + +> **Que se passe-t-il avec : `INSERT INTO Conference VALUES (1, `VLDB`, `VLDB`, `mondiale`, 0)` ?** + +Il n'y a pas de problème car la clé primaire n'est pas violée et la clé étrangère est présente dans la table `Specialite`. + +On obtient donc : + +> | idConf | sigle | nomConf | porteeConf | idSpé | +> |--------|-------|---------|------------|-------| +> | 0 | BDA | BD annuelle | France | 0 | +> | 1 | VLDB | VLDB | mondiale | 0 | + +##### Question 4.5 + +> **Que se passe-t-il avec : `DELETE FROM Conference WHERE idConf = 0` ?** + +La suppression est possible car la clé primaire n'est pas violée. Il existe bien une clé primaire avec `idConf` = 0. + +#### Question 5 + +> **Modifier (treÌ€s simplement) l’ensemble des opeÌrations preÌceÌdentes pour qu’elles soient appliqueÌes en ne violant aucune contrainte.** + +On peut modifier les opérations précédentes de la manière suivante : + +```sql +INSERT INTO Specialite VALUES (1, 'maths'); +INSERT INTO AnneConf VALUES (1, 2021, 'Paris', 'France'); +INSERT INTO Conference VALUES (1, 'VLDB', 'VLDB', 'mondiale', 1); +DELETE FROM Conference WHERE idConf = 0; +``` + +On ne viole aucune contrainte avec ces requêtes car on a ajouté une nouvelle spécialité et on a modifié les clés étrangères de `Conference` et `AnneeConf`. + +### Exercice 2 + +#### Question 1 + +> **Donner le script de creÌation des tables `PERSONNE`, `AUTEUR` et `ECRIT` pour le scheÌma relationnel donneÌ ci-dessous. N’oubliez pas de speÌcifier les diffeÌrentes contraintes d’inteÌgriteÌ.** + +Le schéma relationnel est le suivant : + +```plantuml +@startuml + + +!define primary_key(x) <b><color:#b8861b><&key></color> x</b> +!define foreign_key(x) <color:#aaaaaa><&key></color> x +!define column(x) <color:#efefef><&media-record></color> x +!define table(x) entity x << (T, white) >> + +table(Personne) { + + primary_key( idPers ) : int + column( nom ) : varchar + column( prenom ) : varchar + +} + +table( Auteur ) { + + primary_key( idPers ) : int + column( labo ) : varchar + foreign_key( idSpe ) : int + +} + +table( Specialite ) { + + primary_key( idSpe ) : int + column( libelle ) : varchar + +} + +table( Lecteur ) { + + foreign_key( primary_key( idPers ) ) : int + column( email ) : varchar + column( adresse ) : varchar + column( ville ) : varchar + column( code ) : int + column( pays ) : varchar + +} + +table( Ecrit ) { + + foreign_key( primary_key( idPers ) ) : int + foreign_key( primary_key( idConf ) ) : int + column( ordre ) : int + +} + +table( Conference ) { + + primary_key( idConf ) : int + column( sigle ) : varchar + column( nomConf ) : varchar + column( porteeConf ) : varchar + foreign_key( idSpe ) : int + +} + +table( AnneeConf ) { + + foreign_key( primary_key( idConf ) ) : int + primary_key( annee ) : int + column( ville ) : varchar + column( pays ) : varchar + +} + +table( Article ) { + + primary_key( idArt ) : int + column( titre ) : varchar + column( typeArt ) : varchar + column( format ) : varchar + column( emplacement ) : int + column( taille ) : int + foreign_key( annee ) : int + foreign_key( idConf ) : int + +} + +table( Telechargement ) { + + primary_key( idTelechargement ) : int + column( dateTelechargement ) : date + column( vitesse ) : int + foreign_key( idArt ) : int + foreign_key( idPers ) : int + +} + +Lecteur --> Personne +Ecrit --> Auteur +Auteur -> Personne +Auteur --> Specialite +Conference -> Specialite +AnneeConf -> Conference +Article -> AnneeConf +Ecrit -> Article +Telechargement -> Article +Telechargement -> Lecteur + +@enduml +``` + + +Le script de création des tables est le suivant : + +```sql +CREATE TABLE Personne ( + idPers INT NOT NULL, + nom VARCHAR(50) NOT NULL, + prenom VARCHAR(50) NOT NULL, + PRIMARY KEY (idPers) +); + +CREATE TABLE Auteur ( + idPers INT NOT NULL, + labo VARCHAR(50) NOT NULL, + idSpe INT NOT NULL, + PRIMARY KEY (idPers), + FOREIGN KEY (idPers) REFERENCES Personne(idPers), + FOREIGN KEY (idSpe) REFERENCES Specialite(idSpe) +); + +CREATE TABLE Ecrit ( + idPers INT NOT NULL, + idConf INT NOT NULL, + ordre INT NOT NULL, + PRIMARY KEY (idPers, idConf), + FOREIGN KEY (idPers) REFERENCES Personne(idPers), + FOREIGN KEY (idConf) REFERENCES Conference(idConf) +); +``` + +#### Question 2 + +> **Vider la table avec des auteurs.** + +On peut vider la table avec des auteurs avec la requête suivante : + +```sql +DELETE FROM Auteur; +``` + +#### Question 3 + +> **Supprimer les tables PERSONNE, AUTEUR et ECRIT.** + +On peut supprimer les tables avec la requête suivante : + +```sql +DROP TABLE Ecrit; +DROP TABLE Auteur; +DROP TABLE Personne; +``` + +### Exercice 3 + +#### Question 1 + +> **EÌcrire une requeÌ‚te SQL pour reÌcupeÌrer les speÌcialiteÌs.** + +On peut récupérer les spécialités avec la requête suivante : + +```sql +SELECT * FROM Specialite; +``` + +#### Question 2 + +> **EÌcrire une requeÌ‚te SQL pour reÌcupeÌrer les sigles et noms des confeÌrences.** + +On peut récupérer les sigles et noms des conférences avec la requête suivante : + +```sql +SELECT sigle, nomConf FROM Conference; +``` + +#### Question 3 + +> **EÌcrire une requeÌ‚te SQL pour reÌcupeÌrer sans reÌpeÌtition les villes ouÌ€ une confeÌrence a eu lieu.** + +On peut récupérer les villes où une conférence a eu lieu avec la requête suivante : + +```sql +SELECT DISTINCT ville FROM AnneeConf; +``` + +#### Question 4 + +> **EÌcrire une requeÌ‚te SQL pour reÌcupeÌrer les noms de confeÌrence associeÌe aux villes et l’anneÌe ouÌ€ elle a eu lieu.** + +On peut récupérer les noms de conférence associée aux villes et l'année où elle a eu lieu avec la requête suivante : + +```sql +SELECT nomConf, ville, annee FROM AnneeConf NATURAL JOIN Conference; +``` diff --git a/DB Implementation/TD/TD1.pdf b/DB Implementation/TD/TD1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed2dfbffeb4cee08ead7bc5d8db9a5c4c109e5df Binary files /dev/null and b/DB Implementation/TD/TD1.pdf differ diff --git a/DB Implementation/TD/TD2.md b/DB Implementation/TD/TD2.md new file mode 100644 index 0000000000000000000000000000000000000000..19d8fa69a7e2128efdd19750bfef94e374be3902 --- /dev/null +++ b/DB Implementation/TD/TD2.md @@ -0,0 +1,193 @@ +--- +title: TD 2 Implémentation BDD +author: VAN DE MERGHEL Robin +date: 2023 +lang: fr +geometry: margin=2cm +--- + +# Exercice 1 + +> **Considérons les deux transactions suivantes :** +> `T1 : READ(A,t) ; t := t+2 ; WRITE(A,t) ; READ(B,t) ; t=t*3 ; WRITE(B,t) ; COMMIT` +> `T2 : READ(B,s) ; s := s*2 ; WRITE(B,s) ; READ(A,s) ; s=s+3 ; WRITE(A,s) ; COMMIT` + + +## Question 1 + +> **Donner les plans correspondant aux exécutions en série $(T_1,T_2)$ et $(T_2,T_1)$** + +Avc $(T_1, T_2)$ : + +| $T_1$ | $T_2$ | A | B | +|-------|-------|---|---| +| $r(A, t)$ | | $a$ | | +| $t:=t+2$ | | $a$ | | +| $w(A, t)$ | | $a+2$ | | +| $r(B, t)$ | | $a+2$ | $b$ | +| $t:=t\times 3$ | | $a+2$ | $b$ | +| $w(B, t)$ | | $a+2$ | $b\times 3$ | +| $commit$ | | $a+2$ | $b\times 3$ | +| | $r(B, s)$ | $a+2$ | $b\times 3$ | +| | $s:=s\times 2$ | $a+2$ | $b\times 3$ | +| | $w(B, s)$ | $a+2$ | $b\times 6$ | +| | $r(A, s)$ | $a+2$ | $b\times 6$ | +| | $s:=s+3$ | $a+2$ | $b\times 6$ | +| | $w(A, s)$ | $a+5$ | $b\times 6$ | +| | $commit$ | $a+5$ | $b\times 6$ | + + +État final : $A = a+5$ et $B = b\times 6$ + +Avec $(T_2, T_1)$ : + +| $T_2$ | $T_1$ | A | B | +|-------|-------|---|---| +| $r(B, s)$ | | | $b$ | +| $s:=s\times 2$ | | | $b$ | +| $w(B, s)$ | | | $b\times 2$ | +| $r(A, s)$ | | $a$ | $b\times 2$ | +| $s:=s+3$ | | $a$ | $b\times 2$ | +| $w(A, s)$ | | $a + 3$ | $b\times 2$ | +| $commit$ | | $a + 3$ | $b\times 2$ | +| | $r(A, t)$ | $a + 3$ | $b\times 2$ | +| | $t:=t+2$ | $a + 3$ | $b\times 2$ | +| | $w(A, t)$ | $a + 5$ | $b\times 2$ | +| | $r(B, t)$ | $a + 5$ | $b\times 2$ | +| | $t:=t\times 3$ | $a + 5$ | $b\times 2$ | +| | $w(B, t)$ | $a + 5$ | $b\times 6$ | +| | $commit$ | $a + 5$ | $b\times 6$ | + +État final : $A = a+5$ et $B = b\times 6$ + + +## Question 2 + +> **Montrer que les exécutions $(T_1,T_2)$ et $(T_2,T_1)$ sont équivalentes, en commençant sur un exemple de base de données initial.** + + +On a les deux mêmes états finaux, donc les deux exécutions sont équivalentes. + +## Question 3 + +> **Donner l'exemple d'une exécution de $T_1$ et de $T_2$ qui fait appraître un problème de lectures impropres.** + +Avec $(T_1, T_2)$ : + + +| $T_1$ | $T_2$ | A | B | +|-------|-------|---|---| +| $r(A, t)$ | | $a$ | | +| $t:=t+2$ | | $a$ | | +| $w(A, t)$ | | $a+2$ | | +| $r(B, t)$ | | $a+2$ | $b$ | +| $t:=t\times 3$ | | $a+2$ | $b$ | +| | $r(B, s)$ | $a+2$ | $b$ | +| | $s:=s\times 2$ | $a+2$ | $b$ | +| | $w(B, s)$ | $a+2$ | $b\times 2$ | +| | $r(A, s)$ | $a+2$ | $b\times 2$ | +| | $s:=s+3$ | $a+2$ | $b\times 2$ | +| | $w(A, s)$ | $a+5$ | $b\times 2$ | +| $w(B, t)$ | | $a+5$ | $b\times 2$ | +| $commit$ | | $a+5$ | $b\times 2$ | +| | $commit$ | $a+5$ | $b\times 2$ | + + +On a $a+3$ dans $A$, modifié par $T_2$, alors que $T_1$ n'a pas encore commit. + + +## Question 4 + +> **Donner l'exemple d'une exécution de $T_1$ et de $T_2$ qui fait appraître un problème de perte de mise à jour.** + + +Avec $(T_1, T_2)$ : + +| $T_1$ | $T_2$ | A | B | +|-------|-------|---|---| +| $r(A, t)$ | | $a$ | | +| $t:=t+2$ | | $a$ | | +| $w(A, t)$ | | $a+2$ | | +| $r(B, t)$ | | $a+2$ | $b$ | +| $t:=t\times 3$ | | $a+2$ | $b$ | +| | $r(B, s)$ | $a+2$ | $b$ | +| | $s:=s\times 2$ | $a+2$ | $b$ | +| | $w(B, s)$ | $a+2$ | $b\times 2$ | +| | $r(A, s)$ | $a+2$ | $b\times 2$ | +| | $s:=s+3$ | $a+2$ | $b\times 2$ | +| | $w(A, s)$ | $a+5$ | $b\times 2$ | +| $w(B, t)$ | | $a+5$ | $b\times 2$ | +| $commit$ | | $a+5$ | $b\times 2$ | +| | $commit$ | $a+5$ | $b\times 2$ | + + +On a $a+3$ dans $A$, modifié par $T_2$, alors que $T_1$ n'a pas encore commit. + + +# Exercice 2 + +> **Considérons les deux transactions suivantes :** +> `T1 : r1(a) w1(a) w1(b) r1(b) commit1` +> `T2 : r2(b) w2(b) r2(a) w2(a) commit2` + + +## Question 1 + +> **Donner trois exécutions sérialisables de $T_1$ et $T_2$.** + +On a : + +$$E_1 = (T_1, T_2) = r_1(a) \ w_1(a) \ w_1(b) \ r_1(b) \ r_2(b) \ w_2(b) \ r_2(a) \ w_2(a) \ commit_1 \ commit_2$$ + +| $T_1$ | $T_2$ | +|-------|-------| +| $r_1(A)$ | | +| $w_1(A)$ | | +| $w_1(B)$ | | +| $r_1(B)$ | | +| $commit_1$ | | +| | $r_2(B)$ | +| | $w_2(B)$ | +| | $r_2(A)$ | +| | $w_2(A)$ | +| | $commit_2$ | + + +On a : + +$$E_2 = (T_2, T_1) = r_2(b) \ w_2(b) \ r_2(a) \ w_2(a) \ r_1(a) \ w_1(a) \ w_1(b) \ r_1(b) \ commit_2 \ commit_1$$ + +| $T_2$ | $T_1$ | +|-------|-------| +| $r_2(B)$ | | +| $w_2(B)$ | | +| $r_2(A)$ | | +| $w_2(A)$ | | +| $commit_2$ | | +| | $r_1(A)$ | +| | $w_1(A)$ | +| | $w_1(B)$ | +| | $r_1(B)$ | +| | $commit_1$ | + +On a aussi : + +| $T_1$ | $T_2$ | +|-------|-------| +| $r_1(A)$ | | +| $w_1(A)$ | | +| $commit_1$ | | +| | $r_2(B)$ | +| | $w_2(B)$ | +| | $commit_2$ | +| $w_1(B)$ | | +| $r_1(B)$ | | +| $commit_1$ | | +| | $r_2(A)$ | +| | $w_2(A)$ | +| | $commit_2$ | + +Équivalent à : + +$$E = r_1(a) \ w_1(a) \ commit_1 \ r_2(b) \ w_2(b) \ commit_2 \ w_1(b) \ r_1(b) \ commit_1 \ r_2(a) \ w_2(a) \ commit_2$$ + diff --git a/DB Implementation/TD/TD2.pdf b/DB Implementation/TD/TD2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..85d4e2d24362520511af9d8e2ad659e28035e4a2 Binary files /dev/null and b/DB Implementation/TD/TD2.pdf differ diff --git a/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.png b/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.png new file mode 100644 index 0000000000000000000000000000000000000000..b712bf3459a62e25233306e8e16c4182248e3b73 Binary files /dev/null and b/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.png differ diff --git a/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.uml b/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.uml new file mode 100644 index 0000000000000000000000000000000000000000..2d2d9e857ae8fb8147b73e414b7f12ed2fe271ae --- /dev/null +++ b/DB Implementation/TD/plantuml-images/a4d8dc42f5f8613a2a64383303ec3ec29a47ca54.uml @@ -0,0 +1,30 @@ +@startuml +!define primary_key(x) <b><color:#b8861b><&key></color> x</b> +!define foreign_key(x) <color:#aaaaaa><&key></color> x +!define column(x) <color:#efefef><&media-record></color> x +!define table(x) entity x << (T, white) >> + +table( conference ) { + primary_key( idConf ) : int + column( sigle ) : varchar + column( nomConf ) : varchar + column( porteeConf ) : varchar + foreign_key( idSpé ) : int +} + +table( specialite ) { + primary_key( idSpé ) : int + column( libelle ) : varchar +} + +table( anneeConf ) { + primary_key( annee ) : int + foreign_key( idConf ) : int + column( ville ) : varchar + column( pays ) : varchar +} + +conference <- anneeConf +specialite <- conference + +@enduml \ No newline at end of file diff --git a/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.png b/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.png new file mode 100644 index 0000000000000000000000000000000000000000..25f8b45219729eda88dee9ca5b535356405de236 Binary files /dev/null and b/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.png differ diff --git a/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.uml b/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.uml new file mode 100644 index 0000000000000000000000000000000000000000..110d91d1527ed150fbd11c4e7c1c2e830f2cd31e --- /dev/null +++ b/DB Implementation/TD/plantuml-images/b024c666f5bd66d27319d0b4d89345fbb5f1e25e.uml @@ -0,0 +1,104 @@ +@startuml + + +!define primary_key(x) <b><color:#b8861b><&key></color> x</b> +!define foreign_key(x) <color:#aaaaaa><&key></color> x +!define column(x) <color:#efefef><&media-record></color> x +!define table(x) entity x << (T, white) >> + +table(Personne) { + + primary_key( idPers ) : int + column( nom ) : varchar + column( prenom ) : varchar + +} + +table( Auteur ) { + + primary_key( idPers ) : int + column( labo ) : varchar + foreign_key( idSpe ) : int + +} + +table( Specialite ) { + + primary_key( idSpe ) : int + column( libelle ) : varchar + +} + +table( Lecteur ) { + + foreign_key( primary_key( idPers ) ) : int + column( email ) : varchar + column( adresse ) : varchar + column( ville ) : varchar + column( code ) : int + column( pays ) : varchar + +} + +table( Ecrit ) { + + foreign_key( primary_key( idPers ) ) : int + foreign_key( primary_key( idConf ) ) : int + column( ordre ) : int + +} + +table( Conference ) { + + primary_key( idConf ) : int + column( sigle ) : varchar + column( nomConf ) : varchar + column( porteeConf ) : varchar + foreign_key( idSpe ) : int + +} + +table( AnneeConf ) { + + foreign_key( primary_key( idConf ) ) : int + primary_key( annee ) : int + column( ville ) : varchar + column( pays ) : varchar + +} + +table( Article ) { + + primary_key( idArt ) : int + column( titre ) : varchar + column( typeArt ) : varchar + column( format ) : varchar + column( emplacement ) : int + column( taille ) : int + foreign_key( annee ) : int + foreign_key( idConf ) : int + +} + +table( Telechargement ) { + + primary_key( idTelechargement ) : int + column( dateTelechargement ) : date + column( vitesse ) : int + foreign_key( idArt ) : int + foreign_key( idPers ) : int + +} + +Lecteur --> Personne +Ecrit --> Auteur +Auteur -> Personne +Auteur --> Specialite +Conference -> Specialite +AnneeConf -> Conference +Article -> AnneeConf +Ecrit -> Article +Telechargement -> Article +Telechargement -> Lecteur + +@enduml \ No newline at end of file diff --git a/DB Implementation/cm5.md b/DB Implementation/cm5.md new file mode 100644 index 0000000000000000000000000000000000000000..acfc58d711bf0426f35cd7a7e48eb6b372dd3ba2 --- /dev/null +++ b/DB Implementation/cm5.md @@ -0,0 +1,170 @@ +--- +author: Robin VAN DE MERGHEL +date: 2023 +title: Bases de données +lang: fr +geometry: margin=2cm +--- + +| | partagé | exclusif | +|- | --- | --- | +| partagé | accepté | refusé | +| exclusif | refusé | refusé | + +Si un élément est vérouillé de manière partagée et exclusive alors on dira qu'il est vérrouillé de manière exclusive. + +| $T_1$ | $T_2$ | A | B | +| --- | --- | --- | --- | +| $s_1(A)r_1(A)$ | | 25 | 25 | +| $A = A+10$ | | - | - | +| $X_1(A)W_1(A)u_1(A)$ | - | 125 | - | +| - | $s_2(A)r_2(A)$ | - | - | +| - | $A = 2A$ | - | - | +| - | $X_2(A)w_2(A)u_2(A)$ | 250 | - | +| - | $s_2(B)r_2(B)$ | - | - | +| - | $B = 2B$ | - | - | +| - | $X_2(B)w_2(B)u_2(B)$ | - | 50 | +| $s_1(B)r_1(B)$ | - | - | - | +| $B=B+100$ | - | - | - | +| $x_1(B)w_1(B)u_1(B)$ | - | - | 150 | + +On a une utilisation valide des verrous, qui se suffit pas pour obtenir la sérialisabilité. + +# Verrouillage en deux phases (2PL) + +Pour assurer la sérialisabilité, on considère le protocol de verrouillage en deux phases (2PL). + +Dans chaque transaction, tous les verrous sont déposés avant que le premier verrou ne soit relâché. + +Deux phases de verrouillage : + +- acquisition des verrous +- relâchement des verrous + + + +## Exemple + +| $T_1$ | $T_2$ | A | B | +| --- | --- | --- | --- | +| $s_1(A)r_1(A)$ | | 25 | 25 | +| $A = A+100$ | | - | - | +| $X_1(A)w_1(A)X_1(B)u_1(A)$ | | 125 | - | +| | $s_2(A)r_2(A)$ | - | - | +| | $A = 2A$ | - | - | +| | $X_2(A)w_2(A)$ | 250 | - | +| | $s_2(B)$ | - | - | +| $r_1(B)$ | | - | - | +| $B = B+100$ | | - | - | +| $w_1(B)u_1(B)$ | | - | 125 | +| | $s_2(B)u_2(A)r_2(B)$ | - | - | +| | $B = 2B$ | - | - | +| | $X_2(B)w_2(B)u_2(B)$ | - | 250 | + +# Un risque d'interblocage + +Il y a un risque d'interblocage (dead lock) si avec le protocole 2PL, c'est à dire une situation où des transations sont forcée d'attendre indéfiniment un verrou obtenu par une autre transaction. + + +| $T_1$ | $T_2$ | +| --- | --- | +| $s_1(A)r_1(A)$ | | +| | $s_2(B)r_2(B)$ | +| $A = A+100$ | | +| | $B = 2B$ | +| $X_1(A)w_1(A)$ | | +| | $X_2(B)w_2(B)$ | +| $s_1(B)$ | | +| | $s_2(A)$ | +| *en attente* | *en attente* | + +## Exercice + +> **Rajouter des verrous et voir en quoi ça change l'exécution** + +$$E = r_1(A) \ r_2(B) \ r_3(C) \ W_1(B) \ W_2(C) \ W_3(A)$$ + +$$E = r_1(A) \ r_2(B) \ r_3(C) \ W_3(B) \ W_1(C) \ W_2(A)$$ + + +### Cas 1 + + + +### Cas 2 + + + +# Exécutions réparables en cascade + +On note : + +- $C_i$ commit de la transaction +- $a_i$ annulation de la transaction + +## Exemple + +| $T_1$ | $T_2$ | A | +| --- | --- | --- | +| $r_1(A)$ | | 25 | +| $A = A+100$ | | - | +| $w_1(A)$ | | - | +| | $r_2(A)$ | - | +| | $A = 2A$ | - | +| | $w_2(A)$ | 250 | +| | $C_2$ | - | +| $a_1$ | | - | + +L'action de $T_2$ ne peut-être conserve car elle repose sur celle de $T_1$, qui a été annulée, mais $T_2$ ne peut être annulée car elle a été validée. + +## Définition + +Une exécution est reparable en cascade si chaque transaction est validée après les transactions dont elle a lu des données modifier. + +Tu peux reverse avec `ROLLBACK`(merci frérot) + +Ryadh a une information très importante : Il a besoin d'aide pour le projet. #JeSuisRyadh. +oui c mwa + +$$E_1 = w_1(A) \ w_1(B) \ w_2(A) \ r_2(B) \ C_1 \ C_2$$ + +$E_1$ est réparable car $T_2$ lit une valeur modifiée par $T_1$, et $T_2$ est validée après $T_1$. + +$$E_2 = w_2(A) \ w_1(B) \ w_1(A) \ r_2(B) \ C_1 \ C_2$$ + +$E_2$ est réparable, mais non sérialisable. + +$$E_3 = r_1(A) \ r_2(B) \ w_2(B) \ w_1(A) \ r_3(B) \ r_2(A) \ w_3(A)$$ + +Si $T_1$ est annulée, alors $T_2$ et $T_3$ doivent être annulées. + +On observe une annulation en cascade. + +## Définition + +Une execution est sous annulation en cascade (SAC), si toutes les transactions lisent des valeurs modifier issues uniquement de transactions déjà validées. + +## Exemple + +- $E_1$ n'est pas SAC. + +- $E_4 : w_1(A) \ w_2(A) \ C_1 \ r_2(B) \ C_2$ + +- $E_4$ est un SAC + +## Proposition + +Si une exécution est SAC, alors elle est réparable en cascade. + +## Définition + +Une exécution avec verrous est stricte si dans chaque transaction, aucun verrou exclusif n'est relâché avant que la transaction ne soit validée ou annulée. + + + +## Proposition + +Une exécution stricte est sérialisable et sans annulation en cascade. + + + diff --git a/DB Implementation/img/Execution.jpg b/DB Implementation/img/Execution.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b3e27a0f10d9b74ebe9906ab6bee47a6b9d765c3 Binary files /dev/null and b/DB Implementation/img/Execution.jpg differ diff --git a/DB Implementation/img/Execution2.jpg b/DB Implementation/img/Execution2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..534d72a801c67da602cd5d5d1d3155ac27084fec Binary files /dev/null and b/DB Implementation/img/Execution2.jpg differ diff --git a/DB Implementation/img/IMG_3274.HEIC b/DB Implementation/img/IMG_3274.HEIC new file mode 100644 index 0000000000000000000000000000000000000000..43395f6d5726a165e7b9d95b41f90dc715598687 Binary files /dev/null and b/DB Implementation/img/IMG_3274.HEIC differ diff --git a/DB Implementation/img/IMG_3278.heic b/DB Implementation/img/IMG_3278.heic new file mode 100644 index 0000000000000000000000000000000000000000..9487e148d0cae214f67e7f23c048a125520145f6 Binary files /dev/null and b/DB Implementation/img/IMG_3278.heic differ diff --git a/DB Implementation/img/Verrous Exclusifs.jpg b/DB Implementation/img/Verrous Exclusifs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34ce006873a18c1df74538b59596962e8796e1fb Binary files /dev/null and b/DB Implementation/img/Verrous Exclusifs.jpg differ diff --git a/DB Implementation/img/graphique.jpg b/DB Implementation/img/graphique.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0985ac816ed6e2b2989a3c50076c8c1e7ba4e29 Binary files /dev/null and b/DB Implementation/img/graphique.jpg differ diff --git a/DB Implementation/img/verrous.jpg b/DB Implementation/img/verrous.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07ca65ecb340aa979f1eb4d13e8d8aeafa1ede58 Binary files /dev/null and b/DB Implementation/img/verrous.jpg differ