Как убедиться, что я не обновляю одну и ту же запись из нескольких процессов? Нужны ли настольные замки?
Я работаю над проектом, использующим базу данных 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", поэтому строка не может быть выбрана другими запросами.