Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL InnoDB :Différence entre "FOR UPDATE" et "LOCK IN SHARE MODE"

J'ai essayé de comprendre la différence entre les deux. Je documenterai ce que j'ai trouvé dans l'espoir que cela sera utile à la prochaine personne.

Les deux LOCK IN SHARE MODE et FOR UPDATE assurez-vous qu'aucune autre transaction ne peut mettre à jour les lignes sélectionnées. La différence entre les deux réside dans la façon dont ils traitent les verrous lors de la lecture des données.

LOCK IN SHARE MODE n'empêche pas une autre transaction de lire la même ligne qui était verrouillée.

FOR UPDATE empêche les autres lectures verrouillables de la même ligne (les lectures non verrouillables peuvent toujours lire cette ligne ; LOCK IN SHARE MODE et FOR UPDATE verrouillent les lectures).

Cela est important dans des cas comme la mise à jour des compteurs, où vous lisez la valeur dans 1 instruction et mettez à jour la valeur dans une autre. Ici, en utilisant LOCK IN SHARE MODE permettra à 2 transactions de lire la même valeur initiale. Ainsi, si le compteur a été incrémenté de 1 par les deux transactions, le décompte final peut n'augmenter que de 1 - puisque les deux transactions ont initialement lu la même valeur.

Utilisation de FOR UPDATE aurait verrouillé la 2ème transaction de la lecture de la valeur jusqu'à ce que la première soit terminée. Cela garantira que le compteur est incrémenté de 2.