2012-06-01 4 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; 

이 트리거는 로컬 env에서 제대로 작동하지만 생산 과정에서 무한 루프로 진행됩니다. 누구든지이 동작에 대해 알 수 있습니까?

로컬 및 프로덕션 환경에서는 mysql 5.5가 실행 중입니다.

+1

어떻게 가능합니까? 유일한 방법은 내가 가지고 있다고 생각하지 않는 무한한 레코드가 있거나 트리거가 자체 호출 (재귀 함수)하고 재귀 호출 수가 무한대가 아닌 max_sp_recursion_depth에 있다는 것입니다. – jcho360

답변

0

DBA로부터 답변을 얻었습니다.

그래서 재귀 버그가 아니기 때문에 (오류 메시지는 정말 좋지 않았고 하나처럼 보였지만). 오히려 그것은 메모리 복잡성 문제였습니다.

기본적으로 각 문은 제한된 메모리 공간 (이 경우 128K)에서 실행해야합니다. 대부분의 문장은이 공간보다 훨씬 적지 만이 트리거는 상당히 많은 메모리 요구 사항을 가지고있는 것처럼 보입니다.

테스트에서이 작업이 수행 된 이유는 시도한 테스트가 충분히 크지 않았기 때문입니다. ,

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

기본적으로 :

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

그러나 실제로 생산에 실행하는 것은이 테스트에서 근무, 예를 들어

(그리고 테스트 서버 가능성에 할당 더 많은 메모리를했다) java/hibernate 시스템이 모든 단일 필드를 UPDATE하는 중입니다. 이유가 있습니다. 이것은 꽤 어리석은 일이며, 최대 절전 모드는 아마 덜해야 할 것입니다.

실제 쿼리가 상당히 복잡해 지자 제작시 메모리 제한을 초과했습니다.

관련 문제