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;

このトリガーはローカル環境では正常に機能していますが、本番環境では無限ループに入ります。誰かがこの振る舞いについて何か考えを持っていますか?

ローカル環境と本番環境はmysql5.5を実行しています。

4

1 に答える 1

0

DBAからこの回答を得ました。

したがって、これは再帰バグではありませんでした(ただし、エラーメッセージは非常に悪く、1つのように見えました)。むしろ、それはメモリの複雑さの問題でした。

基本的に、各ステートメントは限られたメモリスペース(この場合は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システムはすべてのフィールドを更新しています...何らかの理由で。これはかなりばかげているので、休止状態の方がおそらく少ないはずです。

実際のクエリはかなり複雑であるため、本番環境のメモリ制限を超えてしまいました。

于 2012-06-01T19:09:39.307 に答える