【发布时间】:2014-08-07 15:28:02
【问题描述】:
场景:我有一些触发器可以跟踪一个表的记录数以及其他有用信息。这些触发器在此表上添加/删除/更新时触发,并负责将此信息写入另一个补充表中。
现在这些触发器将在多线程环境中运行,在该环境中我可能可以同时访问表。 我希望我能做这样的事情,但这是被禁止的(ERROR: Error Code: 1314. LOCK is not allowed in stored procedures):
DELIMITER $$
DROP TRIGGER IF EXISTS del_alarmCount$$
CREATE TRIGGER del_alarmCount AFTER DELETE ON Alarm
FOR EACH ROW
BEGIN
SET autocommit=0;
LOCK TABLES AlarmCount WRITE, AlarmMembership READ;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
MemberId = 0 AND
IsResolved = OLD.IsResolved;
UPDATE AlarmCount SET num = num - 1
WHERE RuleId = OLD.RuleId AND
IsResolved = OLD.IsResolved AND
MemberId IN (SELECT MemberId FROM AlarmMembership WHERE AlarmId=OLD.Id);
COMMIT;
UNLOCK TABLES;
END $$
DELIMITER ;
使用这些 LOCKS(或替代结构)实现的目标是:
- 避免两个触发器同时运行在 AlarmCount 表上写入并更新相关记录(我想我可能有两个触发器为 Alarm 表的不同记录运行更新同一条 AlarmCount 记录)
- 确保 AlarmMembership 表不会同时被修改(例如目标 MemberId 被同时删除)。
非常欢迎任何建议!
【问题讨论】:
标签: mysql concurrency triggers locking