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é).