2013-02-14 13 views
5

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.

+0

Wyślij wyniki z 'pokaż zmienne takie jak '% commit%'' pls. Przypuszczam, że wyłączyłeś auto_commit – ravnur

+0

Edytowałem mój oryginalny post z żądanym wyjściem. – Mopper

+0

Czy wszystkie tabele zawierają tabele "InnoDB"? Jeśli mieszkasz silniki pamięci masowej, możesz popaść w kłopoty. – jeremycole

Odpowiedz

3

Dzieje się tak z powodu DEADLOCK, dlatego następuje jawne zatwierdzanie/wycofywanie. Spróbuj wykonać tę czynność. Oto kilka linków, które mogą ci pomóc.

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

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

spróbuje użyć odczytu popełnione poziom izolacji.

transaction-isolation = READ-COMMITTED 

To może rozwiązać problem. Oto linki odsyłające

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

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

nadzieję, że to pomoże.