Поэтому я создал поле lock_id в этой таблице, и я обновляю ее, указав идентификатор задания, которое обрабатывает эту строку данных.
И когда новое задание хочет выбрать свободную строку, я проверяю поле lock_id равным 0.
Но поскольку этот проект огромен, это вызывало некоторые проблемы, когда два задания пытались выбрать строку одновременно. Поэтому я реализовал вторую проверку: когда я хочу обновить lock_id, я также проверит количество затронутых строк. Если оно равно нулю, это означает, что эта строка уже занята другим заданием.
Код: Выделить всё
UPDATE myTable SET lock_id=1234 WHERE id=? AND lock_id=0
Несколько дней назад я столкнулся со странным поведением, которое вызывало одна строка выбирается двумя заданиями, которые даже не запускались одновременно (у некоторых из них разница составляет около 30 секунд)!
Сначала я подумал, что это может быть какой-то кеш из Mysql, поэтому я изменил свой оператор SELECT на этот:
Код: Выделить всё
SELECT myTable.*, NOW() FROM myTable WHERE lock_id=0
P.S: этот проект касается непосредственно денег и каждый раз, когда возникает эта проблема, я теряю реальные деньги. Так что мне очень жаль исправлять это как можно скорее.
Версия PHP: 8.1.27
Версия Mysql: 5.7.44
Подробнее здесь: https://stackoverflow.com/questions/781 ... ct-updates