2013-02-14 19 views
5

प्रतिबद्ध करता है हमारे पास कई तालिकाओं पर एक साधारण ऑडिटिंग सिस्टम है। यह सब ठीक काम करता है, लेकिन हर एक बार ही सही, हम इस तरह एक त्रुटि एक ऑपरेशन आग करने के लिए ट्रिगर का कारण बनता है पर मिलता है:MySQL ट्रिगर किसी भी तरह से

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

दुर्भाग्य से, हम को समझ नहीं सकता कि किस तरह हमारे चलाता एक प्रतिबद्ध कारण बन सकता है ।

ये ट्रिगर हैं कि (कभी कभी) त्रुटि का कारण: अनुरोध पर show variables like '%commit%'

Variable_name Value 
innodb_commit_concurrency 0 
innodb_flush_log_at_trx_commit 1 

संपादित 2

त्रुटि के उत्पादन:

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; 

संपादित करें केवलपर होने के बाद होता है, जो इसे INSERT TRIGGER तक सीमित कर देगा लेकिन फिर भी मुझे कोई संकेत नहीं है कि यह प्रतिबद्धता कैसे पैदा कर सकता है।

हम इस के शीर्ष पर हाइबरनेट है, तो यह वास्तव में हाइबरनेट है कि आवेषण कर रहा है, और हम भी AUDIT_EVENT मेज पर मैप किया गया एक इकाई है, लेकिन हाइबरनेट (चाहिए) कभी नहीं AUDIT_EVENT तालिका को लिखें।

यदि मैंने मदद की है तो मैंने full stacktrace अपलोड किया है।

+0

'शो प्रतिबद्धता' जैसे '% प्रतिबद्ध%' 'pls के पोस्ट परिणाम। मुझे लगता है कि आपने auto_commit – ravnur

+0

को बंद कर दिया है, मैंने आपके मूल पोस्ट को आपके द्वारा अनुरोधित आउटपुट के साथ संपादित किया है। – Mopper

+0

बिल्कुल 'टेबल' इनओडीबी टेबल में शामिल सभी टेबल हैं? यदि आप स्टोरेज इंजन मिश्रण कर रहे हैं तो आप खुद को परेशानी में डाल सकते हैं। – jeremycole

उत्तर

3

यह डेडलॉक के कारण होता है, यही कारण है कि स्पष्ट कमिट/रोलबैक होता है। कृपया इस गतिविधि को संभालने का प्रयास करें। यहां कुछ लिंक दिए गए हैं जो आपकी मदद कर सकते हैं।

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

आशा इस में मदद मिलेगी है।

संबंधित मुद्दे