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。

4

1 回答 1

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 可能应该做的更少。

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

于 2012-06-01T19:09:39.307 回答