Несмотря на то, что это не лучшее решение, поскольку я не знаю, как игнорировать заблокированные строки, я выбираю случайную и пытаюсь получить блокировку.
START TRANSACTION;
SET @v1 =(SELECT myId FROM tests.table WHERE status is NULL LIMIT 1);
SELECT * FROM tests.table WHERE myId=@v1 FOR UPDATE; #<- lock
Установка небольшого тайм-аута для транзакции, если эта строка заблокирована, транзакция прерывается, и я пробую другую. Если я получу блокировку, я обработаю ее. Если (неудача) эта строка была заблокирована, она обрабатывается, и блокировка снимается до истечения моего тайм-аута, тогда я выбираю строку, которая уже была «обработана»! Однако я проверяю поле, которое установили мои процессы (например, статус): если другая транзакция процесса завершилась нормально, это поле говорит мне, что работа уже выполнена, и я не обрабатываю эту строку снова.
Любое другое возможное решение без транзакций (например, установка другого поля, если строка не имеет статуса и ... и т. Д.) Может легко обеспечить условия гонки и пропущенные процессы (например, один поток внезапно умирает, выделенные данные все еще помечены, а срок действия транзакции истекает, см. комментарий здесь
Надеюсь, это поможет