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

Mysql select for update - il ne verrouille pas les lignes cibles. Comment puis-je m'assurer que c'est le cas ?

A SELECT FOR UPDATE verrouille la ligne que vous avez sélectionnée pour la mise à jour jusqu'à la fin de la transaction que vous avez créée. Les autres transactions peuvent uniquement lire cette ligne mais elles ne peuvent pas la mettre à jour tant que la transaction de sélection pour mise à jour est toujours ouverte.

Pour verrouiller la ou les lignes :

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Run whatever logic you want to do
COMMIT;

La transaction ci-dessus sera active et verrouillera la ligne jusqu'à ce qu'elle soit validée.

Pour le tester, il existe différentes manières. Je l'ai testé en utilisant deux instances de terminal avec le client MySQL ouvert dans chacune.

Sur le first terminal vous lancez le SQL :

START TRANSACTION;
SELECT * FROM test WHERE id = 4 FOR UPDATE;
# Do not COMMIT to keep the transaction alive

Sur le second terminal vous pouvez essayer de mettre à jour la ligne :

UPDATE test SET parent = 100 WHERE id = 4;

Puisque vous créez une sélection pour la mise à jour sur le first terminal la requête ci-dessus attendra que la transaction de sélection pour la mise à jour soit validée ou elle expirera.

Revenir au first terminal et validez la transaction :

COMMIT;

Vérifiez le second terminal et vous verrez que la requête de mise à jour a été exécutée (si elle n'a pas expiré).