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.
Invia risultati di 'mostra variabili come '% commit%'' pls. Suppongo che tu spenga auto_commit – ravnur
Ho modificato il mio post originale con l'output richiesto. – Mopper
Sono assolutamente tutte le tabelle coinvolte tabelle 'InnoDB'? Se stai mescolando i motori di archiviazione potresti metterti nei guai. – jeremycole