MySQL 触发器进入无限循环。

3
我在用户表上有以下触发器,它将名称字段的值复制到电子邮件字段。
CREATE TRIGGER copy_name_on_insert BEFORE INSERT ON users
FOR EACH ROW
  SET NEW.email = NEW.name;

CREATE TRIGGER copy_name_on_update BEFORE UPDATE ON users
FOR EACH ROW
  SET NEW.email = NEW.name;

这个触发器在本地环境下运行正常,但在生产环境中会陷入无限循环。

有没有人对这种行为有什么想法?

本地和生产环境都在运行mysql 5.5。


1
怎么可能呢?唯一的可能是你有无限记录,但我觉得你没有;或者触发器在调用自身(递归函数),而递归调用的次数在max_sp_recursion_depth之内,这并不是无限的。 - jcho360
1个回答

0

我们从我们的数据库管理员那里得到了这个答案。

所以,这不是一个递归错误(尽管错误消息非常糟糕,看起来像一个递归错误)。相反,这是一个内存复杂度问题。

基本上,每个语句必须在有限的内存空间(在这种情况下为128K)中运行。虽然大多数语句都适合远远少于这个空间,但似乎这个触发器需要更多的内存。

之所以在测试中可以工作,是因为尝试的测试不够大。(而且测试服务器可能分配了更多的内存)

例如,这在测试中可以工作:

UPDATE users SET name="j@mail.com" WHERE id=1234;

但实际上在生产环境中运行的是:

update users set full_name='Jason H', attr1='abc1', attr2='abc', attr3='adad' .... where id=1917;

基本上,Java/Hibernate系统正在更新每个字段...出于某种原因。这相当愚蠢,Hibernate可能应该做得更少。

真实查询的相当大的复杂性使其超出了生产中的内存限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接