いくつかのテーブルに単純な監査システムがあります。これはすべて正常に機能しますが、トリガーを起動させる操作で次のようなエラーが発生することがあります。
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
。
それが役立つ場合は、完全なスタックトレースをアップロードしました。