मेरे पास लगभग 5,000,000 पंक्तियों वाली एक MySQL तालिका है जिसे डीबीआई के माध्यम से समानांतर पर्ल प्रक्रियाओं द्वारा लगातार छोटे तरीकों से अद्यतन किया जा रहा है। तालिका में लगभग 10 कॉलम और कई इंडेक्स हैं।MySQL त्रुटि के आसपास काम करना "लॉक प्राप्त करने का प्रयास करते समय पाया गया डेडलॉक; लेनदेन को पुनरारंभ करने का प्रयास करें"
एक बहुत ही आम आपरेशन निम्न त्रुटि कभी कभी को जन्म देता है:
UPDATE file_table SET a_lock = 'process-1234' WHERE param1 = 'X' AND param2 = 'Y' AND param3 = 'Z' LIMIT 47
त्रुटि केवल कभी कभी शुरू हो रहा है:
DBD::mysql::st execute failed: Deadlock found when trying to get lock; try restarting transaction at Db.pm line 276.
एसक्यूएल बयान है कि त्रुटि से चलाता है कुछ इस तरह है। मैं 1% कॉल या उससे कम अनुमान लगाऊंगा। हालांकि, यह एक छोटी सी मेज के साथ कभी नहीं हुआ और डेटाबेस बढ़ने के साथ ही अधिक आम हो गया है।
ध्यान दें कि मैं file_table में a_lock फ़ील्ड का उपयोग कर रहा हूं यह सुनिश्चित करने के लिए कि चार निकट-समान प्रक्रियाएं जो मैं चल रहा हूं, उसी पंक्ति पर कोशिश करने और काम करने की कोशिश नहीं करते हैं। सीमा को उनके काम को छोटे हिस्सों में तोड़ने के लिए डिज़ाइन किया गया है।
मैंने MySQL या DBD :: mysql पर बहुत अधिक ट्यूनिंग नहीं की है। MySQL एक मानक सोलारिस तैनाती है, और डेटाबेस कनेक्शन की स्थापना की है इस प्रकार है:
my $dsn = "DBI:mysql:database=" . $DbConfig::database . ";host=${DbConfig::hostname};port=${DbConfig::port}";
my $dbh = DBI->connect($dsn, $DbConfig::username, $DbConfig::password, { RaiseError => 1, AutoCommit => 1 }) or die $DBI::errstr;
मैं ऑनलाइन देखा है कि कई अन्य लोगों को मिलती-जुलती त्रुटियां सूचित किया है और यह एक वास्तविक गतिरोध स्थिति हो सकती है।
मैं दो प्रश्न हैं:
वास्तव में क्या बारे में मेरी स्थिति उपरोक्त त्रुटि उत्पन्न कर रहा है?
क्या इसके आसपास काम करने या इसकी आवृत्ति को कम करने का कोई आसान तरीका है? उदाहरण के लिए, मैं "डीबीपीएम लाइन 276 पर लेनदेन को पुनरारंभ करने" के बारे में वास्तव में कैसे जा सकता हूं?
अग्रिम धन्यवाद।
हमें कौन से त्रुटि कोडों को पकड़ने की आवश्यकता है? अकेले 1205 पकड़ रहा है? Http://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html में 900 से अधिक त्रुटि कोड हैं। आप अपने सभी प्रयासों को कैसे जानते हैं जिन्हें हमें आपके प्रयास/पकड़ सुझाव के लिए उचित समाधान लागू करने के लिए पकड़ने की आवश्यकता है? – Pacerier
इसका मतलब यह है कि इन समस्याओं की जरूरत नहीं है 'InnoDB या किसी पंक्ति-स्तर व्यवहार RDBMS' के अलावा अन्य? –