There - это некоторая документация по mysql, может быть интересно решить вашу задачу, не уверен, что она вам подходит, но она описывает правильный способ выбора, за которым следует обновление.
Описанная техника не предотвращает чтение других сессий, но предотвращает запись выбранной записи до конца транзакции.
Он содержит пример, аналогичный вашу проблему:
SELECT counter_field FROM child_codes FOR UPDATE;
UPDATE child_codes SET counter_field = counter_field + 1;
Это требуется, что вы таблицы используют Innodb двигатель и ваши программы используют транзакцию.
Если вам нужна блокировка только на короткое время, то есть один сеанс выберите строку с замком, обновить его и снять блокировку в одной сессии, то вам не нужно состояние поля на всех, просто используйте select ... for update
и select ... lock in share mode
так, если все сеансы будут использовать эти два совместно с транзакциями select... for update
, а затем update
, чтобы изменить, и select ... with shared lock
, чтобы просто читать - это решит ваши требования.
Если вам нужно заблокировать в течение длительного времени, выберите и заблокируйте в течение одного сеанса, а затем обновите и отпустите в другом, а затем правильно используйте некоторое хранилище, чтобы сохранить статусы блокировки, и весь сеанс должен использоваться, как описано ниже: select ... for update
и установить статус и статус владельца в один сеанс, затем в другом сеансе select for update
проверить статус и владельца, обновить и удалить статус - для сценария обновления и для сценария чтения: select ... with shared lock
проверить статус.
Используйте процедуру для возврата результатов и добавьте обновление после столбца флажка. – Mihai
Почему вы выбираете его? – Strawberry
Я выбираю клиента и делаю автоматический вызов на основе поля phone_number. Проблема в том, что если я уже отправил клиента на звонок, я не хочу, чтобы этот клиент появлялся другому парню call-центра. Теперь происходит то, что тот же клиент появляется для двух или более парней call-центра, и это плохо. – daryqsyro