J’ai évoqué dans un précédent article les différents modes de verrouillage communément utilisés par les SGBD. Je ne compte bien entendu pas épuiser toute la question tant il semble qu’il y ait de choses à dire à ce sujet, mais j’ai dernièrement fait une petite découverte qui mérite d’être exposée ici. Je me suis en effet demandé ce qu’il se passait lorsque, au cours d’une même transaction, certaines lignes étaient d’abord verrouillées à l’aide d’un verrou partagé puis d’un verrou exclusif (et inversement). Quel verrou le système va-t-il conserver? Le premier? Le dernier à avoir été mis en place? Ou bien le verrou le plus restrictif?

Premier essai: sélection des lignes d’une table en mode partagé puis exclusif.

START TRANSACTION;			 |
SELECT * FROM tableX LOCK IN SHARE MODE; |
// Affichage des lignes sélectionnées	 |
SELECT * FROM tableX FOR UPDATE;	 |
// Affichage des lignes sélectionnées	 |
					 | START TRANSACTION;
					 | SELECT * FROM tableX LOCK IN SHARE MODE;
					 | // En attente de l'obtention du verrou

Analyse:
c’est de toute évidence le dernier verrou posé par la première transaction qui est pris en compte, autrement la seconde ne serait pas bloquée pour réaliser sa sélection.
Il faut maintenant déterminer si le verrou a été choisi parce qu’il a été posé le dernier ou bien parce qu’il est plus restrictif que le premier.

Second essai: sélection des lignes d’une table en mode exclusif puis partagé.

START TRANSACTION;			 |
SELECT * FROM tableX FOR UPDATE; 	 |
// Affichage des lignes sélectionnées	 |
SELECT * FROM tableX LOCK IN SHARE MODE; |
// Affichage des lignes sélectionnées	 |
					 | START TRANSACTION;
					 | SELECT * FROM tableX LOCK IN SHARE MODE;
					 | // En attente de l'obtention du verrou

Conclusion:
c’est désormais clair, le système prendra toujours en compte le verrou le plus restrictif posé durant la transaction. C’est un élément important à prendre en compte dans des applications où des accès sont réalisés sur les même tables par différents modules indépendants: il n’y a aucun risque de mauvaise gestion de la concurrence si à un moment ou un autre un verrou partagé est déposé sur une ligne auparavant verrouillée de manière exclusive.