2012-06-01 99 views
3

我的用戶表中有以下觸發器,它將值從名稱字段複製到電子郵件字段。mysql觸發器進入無限循環

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; 

該觸發器在本地環境中工作正常,但在生產中它進入無限循環。 有沒有人有任何關於這種行爲的想法?

本地和生產envs正在運行mysql 5.5。

+1

這怎麼可能?唯一的方法是你有我認爲你沒有的無限記錄,或者觸發器正在調用自己(遞歸函數),並且遞歸調用的數量在max_sp_recursion_depth中,這不是無限的。 – jcho360

回答

0

從我們的DBA得到了這個答案。

所以,這不是一個遞歸錯誤(雖然錯誤信息非常糟糕,看起來像一個)。相反,這是一個內存複雜性問題。

基本上,每個語句必須在有限的內存空間(本例中爲128K)中運行。雖然大多數語句都遠遠小於這個空間,但似乎這個觸發器有更大的內存要求。

這在測試中起作用的原因是試圖嘗試的程度不夠大。 (和測試服務器可能有分配給它更多的內存)

作爲一個例子,這個曾在測試:

UPDATE users SET name="[email protected]" WHERE id=1234; 

但真正運行在生產:

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

基本上, java/hibernate系統正在更新每個字段......出於某種原因。這非常愚蠢,而休眠可能應該做的更少。

真正的查詢的複雜性相當大,將它推到生產中的內存限制上。