Странное поведение в MySQL, вызывающее непреднамеренный выбор/обновлениеPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Странное поведение в MySQL, вызывающее непреднамеренный выбор/обновление

Сообщение Anonymous »

в одном из моих проектов мне нужно было реализовать специальную систему блокировки для некоторых строк, чтобы они обрабатывались только одним заданием (процессором) одновременно.
Поэтому я создал поле 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»