Как убедиться, что я не обновляю одну и ту же запись из нескольких процессов? Нужны ли настольные замки?

Я работаю над проектом, использующим базу данных MySQL в качестве бэк-энда (доступ из PHP). Иногда я выбираю строку, выполняю некоторые операции с ней, а затем обновляю запись в базе данных.

Я обеспокоен тем, что другой пользователь мог инициировать аналогичный процесс в той же строке сразу после первого выбора, и его изменения могут перезаписать некоторые изменения, сделанные первым пользователем (поскольку выбор второго пользователя еще не включал эти изменения).

Это актуальная проблема? Должен ли я заблокировать таблицу, и это не окажет серьезного влияния на производительность моего приложения? Любые другие решения?

Просто чтобы быть точным в моей информации, у меня также работает несколько заданий CRON, которые также могут изменять те же данные.

Спасибо!

1 ответ

Решение

Я могу думать о двух решениях, кроме явного использования транзакций:

  • Используйте ВЫБРАТЬ.. ДЛЯ ОБНОВЛЕНИЯ: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
  • Измените значение вручную, чтобы строка не была выбрана другими запросами:

    SET @update_id: = 0;

    ОБНОВЛЕНИЕ table_name SET status = 'IN_PROCESS', id = (SELECT @update_id: = id) ГДЕ status = "ОЖИДАНИЕ" И [ваше состояние] LIMIT 1;

    SELECT @update_id;

Здесь строки, которые нужно выбрать, должны иметь значение status="WAITING". И когда этот запрос выполняется, он выбирает идентификатор и изменяет значение "status", поэтому строка не может быть выбрана другими запросами.

Другие вопросы по тегам