Verrou de clé suivante
Démonstration
On a toujours un verrou exclusif (grâce à notre SELECT ... FOR UPDATE) sur les client_id supérieurs à 14 dans la session
1 (sinon, reposez-le).
Session 2 :
Code : SQL
START TRANSACTION;
INSERT INTO Adoption (client_id, animal_id, date_reservation, prix)
VALUES (15, 61, NOW(), 735.00);
L'insertion est bloquée ! Pas de risque de voir apparaître une ligne fantôme.
Annulez les deux transactions.
Exception
Si la clause WHERE concerne un index UNIQUE (cela inclut bien sûr les clés primaires) et recherche une seule valeur (exemple :
WHERE id = 4), alors seule la ligne concernée (si elle existe) est verrouillée, et pas l'espace juste après dans l'index.
Forcément, s'il s'agit d'un index UNIQUE, l'insertion d'une nouvelle valeur ne changera rien : WHERE id = 4 ne renverra
jamais qu'une seule ligne.
Pourquoi poser un verrou exclusif avec une requête SELECT ?
Après tout, une requête SELECT ne fait jamais que lire des données. Que personne ne puisse les modifier pendant qu'on est en
train de les lire, c'est tout à fait compréhensible. Mais pourquoi carrément interdire aux autres de les lire aussi ?
Tout simplement parce que certaines données sont lues dans le but prévisible et avoué de les modifier immédiatement après.
L'exemple typique est la vérification de stock dans un magasin (ou dans un élevage d'animaux).
Un client arrive et veut adopter un chat, on vérifie donc les chats disponibles pour l'adoption, en posant un verrou partagé :
Session 1 :
Code : SQL
START TRANSACTION;
SELECT Animal.id, Animal.nom, Animal.date_naissance, Race.nom as
race, COALESCE(Race.prix, Espece.prix) as prix
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
LEFT JOIN Race ON Animal.race_id = Race.id
-- Jointure
externe, on ne veut pas que les chats de race
WHERE Espece.nom_courant = 'Chat'
-- Uniquement
les chats...
AND Animal.id NOT IN (SELECT animal_id FROM Adoption) -- ... qui
n'ont pas encore été adoptés
LOCK IN SHARE MODE;
id
nom
date_naissance
race
prix
Partie 5 : Sécuriser et automatiser ses actions
250/414
www.openclassrooms.com
Démonstration
On a toujours un verrou exclusif (grâce à notre SELECT ... FOR UPDATE) sur les client_id supérieurs à 14 dans la session
1 (sinon, reposez-le).
Session 2 :
Code : SQL
START TRANSACTION;
INSERT INTO Adoption (client_id, animal_id, date_reservation, prix)
VALUES (15, 61, NOW(), 735.00);
L'insertion est bloquée ! Pas de risque de voir apparaître une ligne fantôme.
Annulez les deux transactions.
Exception
Si la clause WHERE concerne un index UNIQUE (cela inclut bien sûr les clés primaires) et recherche une seule valeur (exemple :
WHERE id = 4), alors seule la ligne concernée (si elle existe) est verrouillée, et pas l'espace juste après dans l'index.
Forcément, s'il s'agit d'un index UNIQUE, l'insertion d'une nouvelle valeur ne changera rien : WHERE id = 4 ne renverra
jamais qu'une seule ligne.
Pourquoi poser un verrou exclusif avec une requête SELECT ?
Après tout, une requête SELECT ne fait jamais que lire des données. Que personne ne puisse les modifier pendant qu'on est en
train de les lire, c'est tout à fait compréhensible. Mais pourquoi carrément interdire aux autres de les lire aussi ?
Tout simplement parce que certaines données sont lues dans le but prévisible et avoué de les modifier immédiatement après.
L'exemple typique est la vérification de stock dans un magasin (ou dans un élevage d'animaux).
Un client arrive et veut adopter un chat, on vérifie donc les chats disponibles pour l'adoption, en posant un verrou partagé :
Session 1 :
Code : SQL
START TRANSACTION;
SELECT Animal.id, Animal.nom, Animal.date_naissance, Race.nom as
race, COALESCE(Race.prix, Espece.prix) as prix
FROM Animal
INNER JOIN Espece ON Animal.espece_id = Espece.id
LEFT JOIN Race ON Animal.race_id = Race.id
-- Jointure
externe, on ne veut pas que les chats de race
WHERE Espece.nom_courant = 'Chat'
-- Uniquement
les chats...
AND Animal.id NOT IN (SELECT animal_id FROM Adoption) -- ... qui
n'ont pas encore été adoptés
LOCK IN SHARE MODE;
id
nom
date_naissance
race
prix
Partie 5 : Sécuriser et automatiser ses actions
250/414
www.openclassrooms.com
