Странное поведение в 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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Действие, имеющее noHistory, открывает выбор намерения, завершает вызывающее действие
    Anonymous » » в форуме Android
    0 Ответы
    95 Просмотры
    Последнее сообщение Anonymous
  • CSS Grid непреднамеренный разрыв
    Anonymous » » в форуме CSS
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как отключить непреднамеренный ввод пользователя в терминале C#
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как отключить непреднамеренный пользовательский ввод в терминале C#
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как предотвратить обновление объявлений Google, вызывающее событие window.resize
    Anonymous » » в форуме Jquery
    0 Ответы
    102 Просмотры
    Последнее сообщение Anonymous

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