Mamy prosty system kontroli na kilku stołach. To wszystko działa dobrze, ale raz na jakiś czas, otrzymujemy błąd podobny do tego na operację, która powoduje spust na ogień:Wyzwalanie MySQL w jakiś sposób powoduje zatwierdzenie
java.sql.SQLException: Explicit or implicit commit is not allowed in stored function or trigger.
Niestety, nie możemy dowiedzieć się, w jaki sposób nasze wyzwalacze mogą spowodować commit .
Są wyzwalacze, które (czasami) powoduje błąd:
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: Na życzenie wyjście show variables like '%commit%'
Variable_name Value
innodb_commit_concurrency 0
innodb_flush_log_at_trx_commit 1
Edycja 2
błędu tylko zdarza się po INSERT
na my_schema.FILE_DESCRIPTOR
, więc zawęziłoby to do INSERT TRIGGER
, ale nawet wtedy nie mam pojęcia, jak to może spowodować zatwierdzenie.
Mamy Hibernacja na górze to, więc to rzeczywiście hibernacji że robi wkładki, i mamy też podmiot odwzorowaną na stole AUDIT_EVENT
, ale hibernacji (powinny) nigdy napisać do stołu AUDIT_EVENT
.
Przesłałem full stacktrace, jeśli to pomaga.
Wyślij wyniki z 'pokaż zmienne takie jak '% commit%'' pls. Przypuszczam, że wyłączyłeś auto_commit – ravnur
Edytowałem mój oryginalny post z żądanym wyjściem. – Mopper
Czy wszystkie tabele zawierają tabele "InnoDB"? Jeśli mieszkasz silniki pamięci masowej, możesz popaść w kłopoty. – jeremycole