2015-09-10 10 views
5

द्वारा डालने के कारण MySQL में डेडलॉक मेरे पास एक बहुप्रचारित एप्लिकेशन है जो कई बैचों में एक तालिका में INSERT रिकॉर्ड का प्रयास करता है। प्रत्येक धागा एक बैच प्रसंस्करण। कभी-कभी मुझे डेडलॉक त्रुटि मिलती है, निम्नलिखित निशान है।कई धागे

तालिका मैं में एक रिकार्ड डालने के लिए कोशिश कर रहा हूँ इस तरह है:

RecordBase (Col1, Col2, Col3)

Col1 और Col2 एक साथ एक समग्र प्राथमिक कुंजी के रूप में।

मैंने पहले सोचा था कि यह index-record लॉक के कारण हो सकता है लेकिन ट्रेस स्पष्ट रूप से दिखाता है कि एक दूसरे को अवरुद्ध करने वाले बयान में कोई डुप्लिकेट रिकॉर्ड नहीं है। तो यह डेडलॉक क्यों पैदा कर रहा है?

------------------------ LATEST DETECTED DEADLOCK ------------------------ 
2015-09-09 17:13:22 2b70324de700 

*** (1) TRANSACTION: 
TRANSACTION 1787379600, ACTIVE 7 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 486 lock struct(s), heap size 63016, 13085 row lock(s), undo log entries 8713 MySQL thread id 537443, OS thread handle 0x2b703286c700, query id 578560605 127.0.0.1 192.168.1.195 demoreleaseroot update 
INSERT INTO Record_Base VALUES 
('da5fd95c-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5fcf08-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5fc4eb-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5fbabe-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5fb087-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5fa616-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5f99bf-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5f8f0f-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5f5e2e-4d8e-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('da5f52e3-4d8e-11e5-9761-22000bd9028a','101e7d 

*** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 26232190 page no 5961 n bits 160 index `PRIMARY` of table `provalant101_mxradon`.`Record_Base` trx id 1787379600 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 29 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 0: len 30; hex 65376566306364332d353039352d313165352d393736312d323230303062; asc e7ef0cd3-5095-11e5-9761-22000b; (total 36 bytes); 1: len 30; hex 31303165376463642d346338312d313165352d396361302d323230303062; asc 101e7dcd-4c81-11e5-9ca0-22000b; (total 36 bytes); 2: len 6; hex 00006a893f90; asc j ? ;; 3: len 7; hex b40001a7c3290f; asc  ) ;; 4: len 4; hex 80000000; asc  ;; *** 

(2) TRANSACTION: TRANSACTION 1787379848, ACTIVE 1 sec inserting mysql tables in use 1, locked 1 1030 lock struct(s), heap size 112168, 5801 row lock(s), undo log entries 2639 MySQL thread id 537467, OS thread handle 0x2b70324de700, query id 578563042 127.0.0.1 192.168.1.195 demoreleaseroot update INSERT INTO Record_Base VALUES 
('4849f98e-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4849ebe5-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4849c44c-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4849add7-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4849a0ef-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('48499430-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('48498752-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('48496d2d-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4848731e-5094-11e5-9761-22000bd9028a','101e7dcd-4c81-11e5-9ca0-22000bd8028c','0'), 
('4846784e-5094-11e5-9761-22000bd9028a','101e7d 

*** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 26232190 page no 5961 n bits 152 index `PRIMARY` of table `provalant101_mxradon`.`Record_Base` trx id 1787379848 lock_mode X locks gap before rec Record lock, heap no 29 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 0: len 30; hex 65376566306364332d353039352d313165352d393736312d323230303062; asc e7ef0cd3-5095-11e5-9761-22000b; (total 36 bytes); 1: len 30; hex 31303165376463642d346338312d313165352d396361302d323230303062; asc 101e7dcd-4c81-11e5-9ca0-22000b; (total 36 bytes); 2: len 6; hex 00006a893f90; asc j ? ;; 3: len 7; hex b40001a7c3290f; asc  ) ;; 4: len 4; hex 80000000; asc  ;; 

*** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 26232190 page no 14639 n bits 192 index `PRIMARY` of table `provalant101_mxradon`.`Record_Base` trx id 1787379848 lock_mode X locks gap before rec insert intention waiting Record lock, heap no 121 PHYSICAL RECORD: n_fields 5; compact format; info bits 0 0: len 30; hex 38393531613333352d353039342d313165352d393736312d323230303062; asc 8951a335-5094-11e5-9761-22000b; (total 36 bytes); 1: len 30; hex 31303165376463642d346338312d313165352d396361302d323230303062; asc 101e7dcd-4c81-11e5-9ca0-22000b; (total 36 bytes); 2: len 6; hex 00006a893f90; asc j ? ;; 3: len 7; hex b40001a7c71c1c; asc  ;; 4: len 4; hex 80000000; asc  ;; 

*** WE ROLL BACK TRANSACTION (2) 
+1

डेडलॉक्स तब होते हैं जब अधिक लेन-देन लॉक के लिए अनुरोध करते हैं। आपके मामले में, आपके पास एक ही टेबल पर क्लिक करने वाले कई थ्रेड हैं इसलिए यह उम्मीद की जाती है कि डेडलॉक होगा। एक डेडलॉक चिंतित होने का कारण नहीं है। InnoDB स्वचालित रूप से उन्हें पहचानता है और त्रुटियों को फेंकता है। हमारे लिए, डेवलपर्स जो MySQL का उपयोग करते हैं, इसका मतलब है कि हमें त्रुटि के मामले में क्वेरी को दोहराना होगा। कुछ छद्म कोड में, यह कुछ समय होगा (सत्य) अगर (do_query()) तोड़ें; ' – Mjh

+0

@Mjh मैंने अपना आवेदन करने के लिए ऐसा ही किया। मैं सिर्फ विस्तार से जानना चाहता हूं कि इस डेडलॉक का कारण क्या है। – Aashish

+0

डेडलॉक आपके धागे एक ही समय में एक ही टेबल तक पहुंचने के कारण होता है (समवर्ती पहुंच)। डेटा को ओवरराइट करने से रोकने के लिए, MySQL लिखने के लिए तालिका में अनुक्रमिक पहुंच की अनुमति देता है। किसी टेबल पर लिखने की अनुमति देने के लिए थ्रेड या प्रक्रिया के लिए, इसे लॉक प्राप्त करना होगा।हालांकि, जब दो थ्रेड लॉक प्राप्त करने के लिए लड़ रहे हैं - न तो इसे कभी भी प्राप्त होगा - जो एक अनंत लूप में होता है। इस लूप से तोड़ने के लिए, MySQL त्रुटियों को फेंकता है और इसे "डेडलॉक" कहते हैं। टीएल; डीआर: एकाधिक धागे से एक तालिका में आपके समवर्ती डालने से डेडलॉक्स पैदा हो रहा है। (यह सरलीकृत स्पष्टीकरण है) – Mjh

उत्तर

7

इस प्रकार के डेडलॉक्स को गैप लॉक्स के नाम से जाना जाता है। मुझे यह post काफी उपयोगी मिला।

साथ ही, आपको mysql के तंत्र की वजह से अतीत में अपने आवेदन में बहुत कुछ हुआ खाई Mysql Manual

+1

लिंक किए गए पोस्ट में जो कहा गया है, उसके अलावा, आप एक अद्वितीय कुंजी बाधा के बिना समवर्ती आवेषण पर एक डेडलॉक कर सकते हैं, केवल ऑटो जेनरेट की गई प्राथमिक कुंजी और अन्य इंडेक्स का संयोजन होने से समस्या हो सकती है। Https://dba.stackexchange.com/questions/86878/mysql-innodb-deadlock-for-2-simple-insert-queries –

1

डेडलॉक में लॉक करने के बारे में और अधिक पढ़ सकते हैं। मैंने इसे दो तरीकों से हल किया। सबसे पहले, मैंने बैच नौकरियों को एक ही थ्रेड में एक ही टेबल को प्रभावित करने और अनुक्रमिक रूप से चलाने के लिए रखा, दूसरा मैंने डेडलॉक त्रुटि को पकड़ने के लिए क्वेरी निष्पादन के चारों ओर एक कोशिश-पकड़ ब्लॉक डाला और कोशिश की कि एक ही क्वेरी निष्पादन 5+ बार कोशिश करें जिसमें प्रयासों के बीच नींद कार्य शामिल है ।

0

मुझे यह समस्या मेरे ऊपर आई, @ आशीष के जवाब ने मुझे यह समझाया, इसलिए यदि आप समझना चाहते हैं कि यह मेरे लिए क्यों काम करता है तो आपको उसका जवाब पढ़ने की जरूरत है।

परिदृश्य मैं था:

मैं पर स्तंभों का दिनांक और idSomething एक अद्वितीय सूचकांक था

मैं 12 धागे का एक पूल डालने के लिए किया था (क्रम महत्वपूर्ण है, दिनांक 1 और idSomething दूसरे नंबर पर था) प्रत्येक आईडी के लिए तारीखों (3 दिन) की एक ही सीमा कुछ (लगभग 1500 अलग-अलग idSomethings)।

ठीक:

अद्वितीय सूचकांक बदलने स्तंभ idSomething (1) और दिनांक (2) पर किया जाना है। फिर व्यवस्थित ढंग से "Somethings" को संसाधित करने की बजाय प्रक्रिया, मैंने आदेश में एक शफल जोड़ा, इसलिए यह संभावना कम होगी कि आईडी I और I + 1 को एक ही समय में पूल किया जाएगा। इस तरह गैप लॉक्स ने एक-दूसरे को ओवरलैप नहीं किया और डेडलॉक्स का अपमान हुआ।

+0

देखें क्या आप विस्तारित कर सकते हैं, ठीक नहीं कर सकते –

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