2013-02-14 9 views
5

私たちはいくつかのテーブルで簡単な監査システムを持っています。このすべてが正常に動作しますが、すべては一度しばらく、私たちは火にトリガが発生し、操作上、このようなエラーが表示されます。残念ながら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をアップロードしました。

+0

'%commit% '' plsのような 'show variables'の結果を投稿します。私はあなたがauto_commitを無効にしたとします。 – ravnur

+0

あなたが要求した出力で元の投稿を編集しました。 – Mopper

+0

絶対にすべてのテーブルに 'InnoDB'テーブルが含まれていますか?ストレージエンジンを混在させていると、困ったことになる可能性があります。 – jeremycole

答えて

3

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

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

これが役立つことを願っています。

関連する問題