Les verrous
Verrous partagé et exclusif, de ligne ou de table, leur compatibilité, SELECT … FOR UPDATE, verrouillage pessimiste ou optimiste, attente et interblocage que la base détecte et tranche.
- 26 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Verrou partagé : de quoi s'agit-il ?
Voir la réponse
Verrou posé pour lire une donnée : plusieurs transactions peuvent en tenir un en même temps sur la même ligne, mais aucune ne peut l'écrire.
Deux lecteurs ne se gênent pas. En revanche, un écrivain doit attendre qu'ils aient fini, car son verrou exclusif est incompatible avec le verrou partagé.
T1 a exécuté l'UPDATE ci-dessous sans valider. T2 exécute alors un UPDATE sur la même ligne. Que se passe-t-il pour T2 ?
```sql
UPDATE compte SET solde = solde - 10 WHERE id = 1;`- Elle attend que T1 valide ou annule
- Elle échoue aussitôt avec une erreur
- Elle passe et écrase la modification de T1
- Elle passe en lisant l'ancienne valeur
Voir la réponse
Elle attend que T1 valide ou annule
T1 tient un verrou exclusif sur la ligne jusqu'à sa fin. T2 attend, puis repart avec la valeur validée par T1, sans la perdre.
Deux verrous … sont compatibles, mais un verrou … n'est compatible avec aucun autre verrou sur la même ligne.
Voir la réponse
Deux verrous partagés sont compatibles, mais un verrou exclusif n'est compatible avec aucun autre verrou sur la même ligne.
Lecteur avec lecteur : sans attente. Dès qu'un écrivain est en jeu, l'un des deux attend l'autre.
Verrou exclusif : de quoi s'agit-il ?
Voir la réponse
Verrou posé pour écrire une donnée : une seule transaction le tient, et aucune autre ne peut obtenir de verrou, partagé ou exclusif, sur la même ligne.
Tout UPDATE ou DELETE en pose un sur les lignes touchées, et il n'est relâché qu'au COMMIT ou au ROLLBACK de la transaction.
La base répond « deadlock detected » plusieurs fois par jour sur les virements : certains virent de A vers B, d'autres de B vers A. Quelle correction ?
- Ajouter un index sur la colonne solde pour accélérer les UPDATE
- Passer les virements en READ UNCOMMITTED pour éviter les attentes
- Verrouiller les deux comptes toujours dans le même ordre
- Passer les virements en SERIALIZABLE pour qu'ils ne se croisent plus
Voir la réponse
Verrouiller les deux comptes toujours dans le même ordre
Le cycle naît quand deux transactions prennent les mêmes verrous dans des ordres opposés. Un ordre unique rend le cycle impossible ; au pire, l'une attend l'autre. Un niveau d'isolation plus strict ne change pas l'ordre des verrous. L'application doit aussi savoir relancer une victime.