Добрый день.
Столкнулся со следующей проблемой. В базе содержаться адреса пользователей
| id | addr | ... | status
....
Собственно, хочу чтобы несколько экземпляров скрипта запускались, брали записи и производили определенные манипуляции, где status = 1.
SELECT * FROM table where status = 1 limit 50 for update skip locked
В этом случае блокируется все записи где status = 1, limit никак не помогает.
Провел тесты, и понял что пример работает в случае если условие идет по уникальному ключу, пример
SELECT * FROM table where id = 1 for update
Как быть если нужно делать выборку по status? Юзать redis? Плодить поля типа process_id, locked и тд в базе не хочу.
update!
Сейчас понял что забыл закомментить строку с orderBy. И как оказалось проблема конкретно в этом.
For update при любом условии и orderby блокирует все записи которые подходят под это условие.
UPD v2.
Итак, проблема была в индексах. При блокировке c условием по индексам запрос выполняется с использованием алгоритма объединения индексов
https://dev.mysql.com/doc/refman/5.7/en/index-merg... .
Выходов как я понял несколько: FORCE INDEX, либо создать индекс поверх используемых. Я воспользовался самым простым не особо критичным для меня и удалил индексы.