MySQL触发问题

问题描述:

我开始在MySQL中使用触发器,并有问题。 我写了一些触发器,当我在通知表中插入某些内容时,这些触发器将更新我的用户表并将通知=通知+ 1(给用户)。它似乎可行,但我做了一个'check-cron-script',它每分钟运行一次,并用100%真实值更新用户表(从通知表中计数)。如果cron更新了某些行,则会向我发送电子邮件。如果该脚本进行了一些更改,它会向我发送一封包含具有错误值的user_id的电子邮件。前一段时间,我连续收到两封电子邮件(22:53,22:54),告诉我脚本在用户表中找到了一个不好的值,并且必须更新1行。两封电子邮件都是相同的(相同的用户,相同的东西)。我现在想知道发生了什么事。MySQL触发问题

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之前执行。

触发器是原子的。除非您使用tx_isolation=READ-UNCOMMITTED运行,否则您描述的情况应该是不可能的。

+0

嗨,我看了看,它被设置为REPEATABLE-READ。所以这可能是不可能的。如果你看看查询和触发器,难道你没有看到另一个应该导致我写的东西的问题吗? – Kukosk 2011-04-29 00:38:01