2011-08-08 16 views
9

मैं Working around MySQL error “Deadlock found when trying to get lock; try restarting transaction”MySQL जेडीबीसी: क्या InnoDB डेडलॉक के बाद स्वचालित पुनः प्रयास करने का कोई विकल्प है?

हूँ मुझे पता चला है कि लेनदेन सुरक्षित रूप से reattempted जा सकती है

गतिरोध खतरनाक नहीं हैं। बस पुनः प्रयास करें।
http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html

एक भी "सुपर insert..select" बयान है कि एक के रूप में भी अड़चन मेज पर दो अन्य तालिकाओं का एक में शामिल हो गए कॉम्बो का चयन और उप बयान की स्थिति उपयोग करने के बाद टोंटी तालिका में सम्मिलित नहीं था कुछ छोटी टेबल

बोतल की गर्दन "लॉक की प्रतीक्षा" थी, यह लिखने के लिए कोई संदेह नहीं था। InnoDB सही फिट लग रहा था। (लिखने के लिए भारी मेज के लिए) और इस एक बयान पर हिचकिचाहट अब सब चले गए हैं।

लेकिन अब समस्या उत्पन्न होती है: कथन के हर 100 निष्पादन के लिए, उनमें से लगभग 1 या 2 डेडलॉक के कारण विफल हो जाएंगे। मेरा मानना ​​है कि डेडलॉक केवल "सुपर डालने .. चयन" के उदाहरणों के बीच होता है। मुझे लगता है कि बयान के एक ऑटो पुन: प्रयास करें स्थापित हो जाएगा, लेकिन मैंने सोचा

प्रश्न: MySQL JDBC अपवाद प्राप्त करने के बाद बयान के स्वतः पुन: प्रयास चालू करने के लिए एक विकल्प है, या मैं के लिए मेरे अपने कोड लिखने की क्या ज़रूरत है क्या उस?

com.mysql.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 

इस मामले में, मैंने लेनदेन शुरू नहीं किया है या लेनदेन आदेश बंद नहीं किया है। बस एक "सुपर डालने .. चयन करें" कथन

उत्तर

5

आप कथन दोहरा सकते हैं लेकिन एक परिपूर्ण दुनिया में आपको अपने लेनदेन को वापस लेना चाहिए और इसे फिर से शुरू करना चाहिए। और आपके लेनदेन उस दुनिया में कम होंगे :)

+3

मैं इसे उत्तर देता हूं। –

+0

@ जॉर्जबैली उत्तर पूरे लेनदेन को पुनः प्रयास कर रहा है, सिर्फ कथन ही नहीं। – EJP

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