我的用户表上有以下触发器,它将值从名称字段复制到电子邮件字段。
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。
答案 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可能应该做得更少。
真正的查询的复杂性大大超过了生产中的内存限制。