MySQL Trigger Проблема - PullRequest
       3

MySQL Trigger Проблема

2 голосов
/ 29 апреля 2011

Я начинаю использовать триггеры в MySQL, и у меня возникла проблема.Я написал несколько триггеров, которые обновят мою таблицу пользователей и сделают уведомления = уведомления + 1 (для пользователя), когда я ВСТАВЛЯЮ что-то в таблицу уведомлений.Кажется, это работает, но я сделал 'check-cron-script', который запускается каждую минуту и ​​обновляет таблицу пользователей на 100% истинных значений, которые должны быть там (считайте из таблицы уведомлений).Этот cron отправляет мне электронное письмо, если обновляет некоторые строки.Если этот скрипт внесет какие-то изменения, он отправит мне электронное письмо с идентификатором user_id, значение которого неверно.Некоторое время назад я получил два электронных письма подряд (22:53, 22:54), в которых сообщалось, что скрипт обнаружил неверное значение в таблице пользователей, и мне пришлось обновить 1 строку.Оба письма были одинаковыми (один и тот же пользователь, одно и то же).И теперь мне интересно, что произошло.

UPDATE query:
INSERT INTO notifications (user_id,title,notification) VALUES (%i,%s,%s)

AFTER INSERT TRIGGER:
BEGIN
IF NEW.`new` > 0 THEN
UPDATE users SET notifications=notifications+1 WHERE id=NEW.user_id;
END IF;
END

AFTER UPDATE TRIGGER:
BEGIN
IF OLD.`new` != NEW.`new` THEN
IF OLD.`new` > 0 THEN
UPDATE users SET notifications=notifications-1 WHERE id=OLD.user_id;
END IF;
IF NEW.`new` > 0 THEN
UPDATE users SET notifications=notifications+1 WHERE id=NEW.user_id;
END IF;
END IF;
END

AFTER DELETE TRIGGER:
BEGIN
IF OLD.`new` > 0 THEN
UPDATE users SET notifications=notifications-1 WHERE id=OLD.user_id;
END IF;
END

notifications.new - это tinyint, который указывает, прочитал ли пользователь уведомление уже (значение по умолчанию - 1)

Таблица уведомленийне так часто обновлялся, поэтому я думал о том, что должно было произойти, и единственное, что, я думаю, должно было произойти: 1. Был выполнен запрос UPDATE. 2. Хрон выполнялся до TRIGGER и должен был изменить значение, вызвавбыло неправильно 3. TRIGGER был запущен 4. В следующем запуске cron значение было выше, чем должно было быть, поэтому cron пришлось обновить его снова (тот же пользователь, то же самое, тот же адрес электронной почты)

Но я действительно не знаю, может ли такое случиться.Если AFTER TRIGGER немного задерживается, и если cron может быть выполнен после запроса, но перед TRIGGER.

1 Ответ

0 голосов
/ 29 апреля 2011

Триггеры атомарные. Если вы не используете tx_isolation=READ-UNCOMMITTED, описанный вами сценарий не будет возможен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...