私たちはいくつかのテーブルで簡単な監査システムを持っています。このすべてが正常に動作しますが、すべては一度しばらく、私たちは火にトリガが発生し、操作上、このようなエラーが表示されます。残念ながらMySQLトリガーが何らかの原因でコミットする
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
のの後にのみ発生する傾向がありますだから、それはINSERT TRIGGER
に絞られますが、それでもコミットを引き起こす可能性があります。
私たちは、このの上にHibernateを持っているので、実際にそれが挿入をやっているHibernateの、そして我々はまたAUDIT_EVENT
テーブルの上にマッピングされたエンティティを持っていますが、HibernateはAUDIT_EVENT
テーブルに書き込むことはありません(必要があります)。
私はfull stacktraceをアップロードしました。
'%commit% '' plsのような 'show variables'の結果を投稿します。私はあなたがauto_commitを無効にしたとします。 – ravnur
あなたが要求した出力で元の投稿を編集しました。 – Mopper
絶対にすべてのテーブルに 'InnoDB'テーブルが含まれていますか?ストレージエンジンを混在させていると、困ったことになる可能性があります。 – jeremycole