Это мой запрос:
try {
$this->_db->beginTransaction();
$this->_db->update($this->_name, $data, $where);
$this->_db->commit();
} catch (Exception $e) {
$this->_db->rollback();
throw $e;
}
Я хочу, чтобы какой-то пользователь использовал этот запрос, чтобы эта строка в таблице была заблокирована, а когда запрос завершится, будет разблокирован. Но теперь, если два пользователя используют этот запрос одновременно, они могут обновить эту строку. Моя таблица InnoDB.
Exp.
Если какой-либо пользователь использует этот запрос для обновления новостей с id = 10, и в этот момент другой пользователь использует этот запрос для обновления тех же новостей (id = 10). При следующем обновлении один из пользователей не сможет видеть новую информацию о новостях.
Таблицы InnoDB используют блокировку на уровне строк автоматически. От Справочное руководство по MySQL 5.6: 8.10.1 Методы внутренней блокировки:
MySQL использует блокировку на уровне строк для таблиц InnoDB для поддержки одновременного доступа к записи несколькими сеансами, что делает их подходящими для многопользовательских, высококонкурентных и OLTP-приложений.
Поэтому две строки не могут быть записаны одновременно. Последующие запросы просто помещаются в очередь, пока они не будут готовы к выполнению. (То же самое верно для MyISAM и других типов таблиц, но они используют блокировку на уровне таблиц.) Вам не нужно изменять свой код.
Других решений пока нет …