У меня есть поле с именем hits
в моей таблице, которое регистрирует взаимодействие пользователя с объектами на моем сайте. Например: если пользователь просматривает поле предварительного просмотра объекта hits
будет обновлен и увеличен на 1, если пользователь войдет на страницу объекта, он будет увеличен на 3 и т. Д.MySQL иногда уменьшает значение поля
Все работает как очарование на моем локальном сервере разработки. Но на производственном сервере (онлайн> 50) иногда поле hits
увеличивается на правое значение, а затем в течение нескольких секунд оно может быть уменьшено на случайное небольшое значение (1,2). Эта ошибка не всегда возникает. Я думаю, что решение может быть связано с движком MyISAM, который я сейчас использую для этой таблицы.
Ниже приведен код, реализующий запрос на обновление таблицы (CodeIgniter)
$this->db->set('hits', 'hits+' . (int) $count, FALSE);
$this->db->where('id', $id);
$this->db->update('gallery');
Так что у меня 2 вопроса:
- Как исправить эту ошибку?
- Как выполнить несколько запросов к моей таблице, чтобы дублировать эту ситуацию на локальном сервере разработки?
Удовлетворительно, проблема не здесь – degr
Возможные совпадения транзакций в myIsam? то есть myIsam не выполняет транзакции. Вам нужны последовательные обновления, но они становятся вложенными. Итак, у вас есть два пользователя, которые читают одно и то же текущее значение. Первый пользователь обновляет и сохраняет его. вторых пользовательских обновлений и сохраняет его. Вы потеряете первое обновление пользователя. Он будет отображаться, если вы прочитаете после первого обновления пользователя, а затем после второго обновления пользователя. Вам необходимо применить блокировку для чтения и обновления. –
Похоже, вам нужно будет [заблокировать таблицу] (https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html). Но это может создать новый набор проблем в виде нескольких обновлений get queued – RiggsFolly