5

いくつかのテーブルに単純な監査システムがあります。これはすべて正常に機能しますが、トリガーを起動させる操作で次のようなエラーが発生することがあります。

java.sql.SQLException: Explicit or implicit commit is not allowed in stored function or trigger.

残念ながら、トリガーがどのようにコミットを引き起こすかを理解することはできません。

これらは、(時々) エラーを引き起こすトリガーです:

CREATE
TRIGGER `my_schema`.`fileDescriptorInsertTrigger`
AFTER INSERT ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
    insert into `AUDIT_EVENT`
            (`applicationId`,`classifier`,`lastModified`)
        values
            (NEW.application,'FILE_AND_DIR',NOW())
    on duplicate key
        update lastModified=NOW();

CREATE
TRIGGER `my_schema`.`fileDescriptorUpdateTrigger`
AFTER UPDATE ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
    update `AUDIT_EVENT`
      set lastModified=NOW()
      where classifier='FILE_AND_DIR'
        and applicationId=NEW.application;

CREATE
TRIGGER `my_schema`.`fileDescriptorDeleteTrigger`
AFTER DELETE ON `my_schema`.`FILE_DESCRIPTOR`
FOR EACH ROW
    update `AUDIT_EVENT`
      set lastModified=NOW()
      where classifier='FILE_AND_DIR'
        and applicationId=OLD.application;

編集:リクエストに応じて、の出力show variables like '%commit%'

Variable_name   Value
innodb_commit_concurrency   0
innodb_flush_log_at_trx_commit  1

編集 2

INSERTエラーはonの後にのみ発生する傾向があるmy_schema.FILE_DESCRIPTORため、に絞り込むことINSERT TRIGGERができますが、それでもコミットがどのように発生するのかわかりません。

これの上に Hibernate があるので、実際に挿入を行っているのは Hibernate であり、AUDIT_EVENTテーブルにマッピングされたエンティティもありますが、Hibernate はテーブルに書き込むことはありません (すべきではありません) AUDIT_EVENT

それが役立つ場合は、完全なスタックトレースをアップロードしました。

4

1 に答える 1

3

これはデッドロックが原因で発生します。そのため、明示的なコミット/ロールバックが発生します。このアクティビティを処理してみてください。ここにあなたを助けるかもしれないいくつかのリンクがあります。

http://bugs.mysql.com/bug.php?id=24989

http://lists.mysql.com/commits/27471

読み取りコミット分離レベルを使用してみてください。

transaction-isolation = READ-COMMITTED

これで問題が解決する場合があります。ここに参照用のリンクがあります

http://www.toofishes.net/blog/mysql-deadlocking-simple-inserts/

http://dev.mysql.com/doc/refman/5.5/en/innodb-deadlocks.html

これがお役に立てば幸いです。

于 2013-02-25T19:07:01.460 に答える