Ce verrou signifie en fait, pour les autres sessions : "Je suis en train de lire ces données. Vous pouvez venir les lire aussi, mais
pas les modifier tant que je n'ai pas terminé.".
Verrou exclusif
Pour poser un verrou exclusif, on utilise FOR UPDATE à la fin de la requête SELECT.
Code : SQL
SELECT * FROM Animal WHERE espece_id = 5 FOR UPDATE;
Ce verrou signifie aux autres sessions : "Je suis en train de lire ces données dans le but probable de faire une modification. Ne
les lisez pas avant que j'aie fini (et bien sûr, ne les modifiez pas).".
Transactions et fin d'un verrou de ligne
Les verrous de ligne ne sont donc pas posés par des commandes spécifiques, mais par des requêtes de sélection, insertion ou
modification.
Ces verrous existent donc uniquement tant que la requête qui les a posés interagit avec les données.
Par conséquent, ce type de verrou s'utilise en conjonction avec les transactions. En effet, hors transaction, dès qu'une requête
est lancée, elle est effectuée et les éventuelles modifications des données sont immédiatement validées.
Par contre, dans le cas d'une requête faite dans une transaction, les changements ne sont pas validés tant que la transaction n'a
pas été commitée. Donc, à partir du moment où une requête a été exécutée dans une transaction, et jusqu'à la fin de la transaction
(COMMIT ou ROLLBACK), la requête a potentiellement un effet sur les données.
C'est à ce moment-là (quand une requête a été exécutée mais pas validée ou annulée) qu'il est intéressant de verrouiller les
données qui vont potentiellement être modifiées (ou supprimées) par la transaction.
Un verrou de ligne est donc lié à la transaction dans laquelle il est posé. Dès que l'on fait un COMMIT ou un ROLLBACK de la
transaction, le verrou est levé.
Exemples
Verrou posé par une requête de modification
Session 1 :
Code : SQL
START TRANSACTION;
UPDATE Client SET pays = 'Suisse'
WHERE id = 8;
-- un verrou exclusif sera posé sur la
ligne avec id = 8
Session 2:
Code : SQL
START TRANSACTION;
SELECT * FROM Client
WHERE id = 8;
-- pas de verrou
SELECT * FROM Client
WHERE id = 8
LOCK IN SHARE MODE; -- on essaye de poser un verrou partagé
La première session a donc posé un verrou exclusif automatiquement en faisant un UPDATE.
Partie 5 : Sécuriser et automatiser ses actions
243/414
www.openclassrooms.com
Précédent

- 243/413

Suivant