我开始在MySQL中使用触发器,并且遇到了问题。 我写了一些触发器,当我在通知表中插入内容时,它将更新我的用户表并发出notification = notifications + 1(给用户)。它似乎工作,但我已经制作了一个'check-cron-script',它每分钟运行一次,并使用100%真值来更新users表(从通知表计数)。如果它更新某些行,这个cron会给我发送一封电子邮件。如果该脚本进行了一些更改,它会向我发送一封包含user_id的电子邮件,其中包含错误值。不久前,我连续收到两封电子邮件(22:53,22:54),告诉我脚本在users表中发现了一个错误的值,并且不得不更新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之前执行的cron,必须更改值,因为它是错误的 3. TRIGGER运行了 4.在cron的下一次运行中,值高于它必须的值,因此cron必须再次更新它(相同的用户,相同的东西,同样的电子邮件)
但我真的不知道这样的事情是否会发生。如果AFTER TRIGGER稍微延迟,并且如果cron可以在查询后执行,但在TRIGGER之前执行。
答案 0 :(得分:0)
触发器是原子的。除非您使用tx_isolation=READ-UNCOMMITTED
运行,否则您所描述的方案将无法实现。