La réponse d'Eric est bon, mais je pense que je devrais dire un peu plus ...
Vous avez des colonnes supplémentaires dans votre table disent:
lockhost VARCHAR(60),
lockpid INT,
locktime INT, -- Or your favourite timestamp.
tous les Default NULL.
Ensuite, vous avez les processus de travail "réclamation" les lignes en faisant:
UPDATE tbl SET lockhost='myhostname', lockpid=12345,
locktime=UNIX_TIMESTAMP() WHERE lockhost IS NULL ORDER BY id
LIMIT 100
Ensuite, vous traitez les lignes revendiquées avec SELECT ... WHERE lockhost = 'myhostname' et lockpid = 12 345
Après avoir terminé le traitement d'une ligne, vous effectuez les mises à jour nécessaires et définissez lockhost, lockpid et locktime sur NULL (ou supprimez-le).
Cela arrête la même ligne traitée par plusieurs processus à la fois. Vous avez besoin du nom d'hôte, car vous pouvez avoir plusieurs hôtes en cours de traitement.
Si un processus se bloque alors qu'il traite un lot, vous pouvez vérifier si la colonne "locktime" est très ancienne (beaucoup plus ancienne que le traitement peut éventuellement prendre, disons plusieurs heures). Ensuite, vous pouvez simplement récupérer certaines lignes qui ont un ancien "locktime" même si leur lockhost n'est pas nul.
Il s'agit d'un "modèle de file d'attente" assez courant dans les bases de données; ce n'est pas extrêmement efficace. Si vous avez un taux très élevé d'éléments entrant/sortant de la file d'attente, pensez à utiliser un serveur de file d'attente approprié à la place.