2 votes

Éviter la condition de course de lecture MySQL dans le script de Bash

J'ai une application pour copier des données sur des disques externes. Les demandes de copie sont stockées dans une base de données MySQL et seront lues par plusieurs copieurs, qui exécutent un script bash script pour récupérer les demandes. Une fois qu'une demande est prise en charge, elle est définie comme "en cours" dans la base de données. Cependant, j'essaie d'éviter une situation où plusieurs machines lisent la demande de manière rapprochée et commencent à copier les mêmes données.

J'allais utiliser le verrouillage de table pour faire cela, mais j'ai du mal à le faire parce qu'un verrouillage de table expire lorsqu'une session expire, donc si je le fais.. :

mysql="mysql -h dbhost -u user -pPassword diskcopydb"
echo "LOCK tables diskcopy WRITE;" | $mysql
echo "SELECT SQL_NO_CACHE * FROM diskcopy WHERE status=\"request\"" | $mysql

le verrou a en fait expiré le temps de recevoir les demandes, et la condition de course persiste donc. Il y a une question ici :

MySQL en ligne de commande - puis-je utiliser les VERROUILLAGES dans la pratique ?

où les commandes SQL sont regroupées dans un bloc et sont acheminées ensemble vers MySQL, mais j'ai besoin d'obtenir une sortie de MySQL à mi-chemin pour récupérer les requêtes. Quelqu'un a-t-il une recette pour cela ? Il semble que ce soit un cas d'utilisation assez courant...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X