场景:我有一些触发器,用于跟踪一个表的记录数量和其他有用信息。这些触发器会在对该表进行添加/删除/更新时触发,并负责将这些信息写入另一个补充表中。
现在这些触发器将在一个多线程环境中运行,可能会对表进行并发访问。 我希望能做出类似于这样的东西,但被禁止了(错误:错误代码:1314。不允许在存储过程中使用LOCK):
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 ;
通过这些锁定(或替代结构)要实现的目标是:
- 避免两个触发器同时运行写入AlarmCount表并更新相关记录(我猜可能有两个触发器运行,分别针对Alarm表中不同的记录,但更新AlarmCount的同一条记录)。
- 确保在此期间不会修改AlarmMembership表(例如,目标MemberId在此期间被删除)。
欢迎任何建议!