2017-01-30 13 views
0

У меня есть поле с именем 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 вопроса:

  • Как исправить эту ошибку?
  • Как выполнить несколько запросов к моей таблице, чтобы дублировать эту ситуацию на локальном сервере разработки?
+1

Удовлетворительно, проблема не здесь – degr

+2

Возможные совпадения транзакций в myIsam? то есть myIsam не выполняет транзакции. Вам нужны последовательные обновления, но они становятся вложенными. Итак, у вас есть два пользователя, которые читают одно и то же текущее значение. Первый пользователь обновляет и сохраняет его. вторых пользовательских обновлений и сохраняет его. Вы потеряете первое обновление пользователя. Он будет отображаться, если вы прочитаете после первого обновления пользователя, а затем после второго обновления пользователя. Вам необходимо применить блокировку для чтения и обновления. –

+0

Похоже, вам нужно будет [заблокировать таблицу] (https://dev.mysql.com/doc/refman/5.7/en/internal-locking.html). Но это может создать новый набор проблем в виде нескольких обновлений get queued – RiggsFolly

ответ

0

Спасибо всем за ответы. Во всяком случае, я получил полезную информацию из ваших ответов. Проблема была в краеугольном камне. У меня была функция, работающая каждую минуту каждый третий месяц. Он уничтожил эти хиты. Я исправил этот кронаскус, и теперь все работает. Проверьте свой crontask дважды. Спасибо вам всем за вашу помощь.