mysql触发器进入无限循环

时间:2012-06-01 18:48:58

标签: mysql triggers

我的用户表上有以下触发器,它将值从名称字段复制到电子邮件字段。

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 个答案:

答案 0 :(得分:0)

我们的DBA得到了这个答案。

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

基本上,每个语句必须在有限的内存空间中运行(在本例中为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可能应该做得更少。

真正的查询的复杂性大大超过了生产中的内存限制。