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

comment verrouiller certaines lignes car elles ne sont pas sélectionnées dans une autre transaction

Il semble que vous ayez besoin d'une certaine forme de marqueur pour identifier les lignes comme "en cours d'utilisation" afin que les autres instances ne traitent pas les mêmes données ; que vous utilisiez un booléen ou un type de date n'est pas pertinent, vous devez d'une manière ou d'une autre marquer les lignes utilisées.

Vous pouvez le faire via un répartiteur, un processus ou un thread avec un accès exclusif à votre table et dont le seul travail consiste à sélectionner des lignes et à les transmettre à d'autres processus sur lesquels travailler. Même dans ce cas, le répartiteur devra savoir jusqu'où il se trouve dans les données, vous revenez donc au même problème.

Une autre façon consiste à utiliser un champ pour indiquer que la ligne est utilisée (comme vous l'avez dit dans votre question). Chaque processus met à jour un bloc de lignes avec un identifiant unique, effectué dans une transaction pour verrouiller la table ; J'utiliserais le numéro de connexion renvoyé par CONNECTION_ID() pour les marquer, alors vous savez qu'il est unique.

Après le UPDATE ... WHERE connection_id IS NULL (avec une limite appliquée) la transaction est terminée, le processus peut SELECT ... WHERE connection_id = CONNECTION_ID() pour obtenir leurs lignes à traiter.

Lorsqu'ils ont terminé leur travail, tout le cycle recommence pour marquer le prochain ensemble de rangées jusqu'à ce qu'ils aient tous été traités.