2013-02-14 11 views
5

Abbiamo un semplice sistema di controllo su più tabelle. Tutto questo funziona bene, ma ogni tanto un po ', si ottiene un errore come questo su un'operazione che fa sì che il grilletto per fuoco:Il trigger MySQL in qualche modo causa il commit

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

Purtroppo, non siamo in grado di capire come i nostri trigger potrebbero causare un commit .

Questi sono i trigger che (a volte) causa l'errore:

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; 

Edit: su richiesta, l'uscita di show variables like '%commit%'

Variable_name Value 
innodb_commit_concurrency 0 
innodb_flush_log_at_trx_commit 1 

Edit 2

L'errore tende solo ad accadere dopo un INSERT su my_schema.FILE_DESCRIPTOR, in modo da ridurlo a INSERT TRIGGER ma anche in questo caso non ho idea di come possa causare un commit.

Abbiamo Hibernate in cima a questo, quindi è in realtà Hibernate che sta facendo gli inserti, e abbiamo anche un'entità mappato sul tavolo AUDIT_EVENT, ma Hibernate (dovremmo) mai scrivere al tavolo AUDIT_EVENT.

Ho caricato un full stacktrace se questo aiuta.

+0

Invia risultati di 'mostra variabili come '% commit%'' pls. Suppongo che tu spenga auto_commit – ravnur

+0

Ho modificato il mio post originale con l'output richiesto. – Mopper

+0

Sono assolutamente tutte le tabelle coinvolte tabelle 'InnoDB'? Se stai mescolando i motori di archiviazione potresti metterti nei guai. – jeremycole

risposta

3

Questo succede a causa di DEADLOCK ecco perché si esegue il commit/rollback esplicito. Si prega di provare a gestire questa attività. Ecco alcuni collegamenti che potrebbero aiutarti.

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

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

tenta di utilizzare livello di isolamento lettura commesso.

transaction-isolation = READ-COMMITTED 

Questo potrebbe risolvere il problema. Ecco Collegamenti per riferimento

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

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

Spero che questo vi aiuterà.

Problemi correlati