2012-06-06 11 views
6

के रूप में चुना गया है मेरे पास एक जावा प्रोग्राम है जो एमएस एसक्यूएल में एक टेबल अपडेट करता है। इस तालिका में भी ColdFusion में बनायालेनदेन (प्रक्रिया आईडी) लॉक पर deadlocked था। संचार प्रक्रिया बफर संसाधनों को एक और प्रक्रिया के साथ चुना गया है और डेडलॉक पीड़ित

हाल ही में मैं इस त्रुटि हो रही किया गया है एक वेबसाइट के माध्यम से वेब उपयोगकर्ताओं द्वारा पहुँचा है जब लाइन:

sql_stmt.executeUpdate("update random_selection " 
    + "set forecasted = 1 where " 
    + " randnum = " + ora_rs.getString("RANDNUM") 
    + " and quarter = " + quarter 
    + " and ozip3 = " + ora_rs.getString("OZIP3")); 

सीएफ क्वेरी कि erroring है:

<cfquery name="submit_forecast" datasource="ttmsdropper" username="#request.db_username#" password="#request.db_password#"> 
    INSERT INTO forecast_entry 
    VALUES (<cfqueryparam value="#currentRecord[8]#">) 
</cfquery> 

इस त्रुटि का कारण क्या है और मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

12

एक डेडलॉक तब होता है जब 2 प्रक्रियाएं एक ही समय में एक ही डेटा को हिट करने का प्रयास करती हैं - दोनों डेटा पर समान दावा के साथ। यह बहुत आम है जब बहुत सारी अपडेट/डालने की गतिविधि चल रही है (जैसा कि आप वर्णन करते हैं)। डीबी प्रणाली लेनदेन में से एक "विजेता" चुनती है।

कुछ मामलों में इंडेक्सिंग द्वारा डेडलॉक्स में सुधार या कमी हो सकती है, लेकिन केवल जब चयन शामिल होते हैं - एक अच्छी इंडेक्सिंग रणनीति चुनिंदा प्रदर्शन में सुधार कर सकती है और पंक्ति लॉकिंग को और अधिक कुशल बना सकती है। हालांकि, ऐसे मामले में जहां एक डालने से एक डालने से डेडलॉक आ रहा है, इंडेक्सिंग मदद नहीं करेगा। दरअसल आक्रामक इंडेक्सिंग स्थिति को कम कर सकती है क्योंकि इंडेक्स को डेटा इन्सर्ट या अपडेट के साथ अपडेट किया जाना है।

इसे कैसे हल करें यह आपके सिस्टम पर निर्भर करता है और आप क्या करने की कोशिश कर रहे हैं। आपको या तो सम्मिलित/अद्यतन लॉकिंग को कम करना होगा या किसी भी तरह से अधिक या तेज़ संसाधन प्रदान करना होगा। बंडलिंग एक साथ बंडल करना और उन्हें बैच करना, अधिक प्रोसेस या रैम (कभी-कभी नहीं - हमेशा), क्लस्टरिंग, स्प्लिटिंग टेबल और डेटा, ठीक ट्यूनिंग समांतरता - ये सभी व्यवहार्य विकल्प हो सकते हैं। और कोई कठोर और तेज़ नियम नहीं है।

+1

इस पोस्ट में आने वाले किसी भी व्यक्ति के लिए स्पष्टीकरण देने के लिए, विडंबना विवाद के एक बिंदु के साथ नहीं हो सकता है। यह तब हो सकता है जब विवाद के दो बिंदु (कम से कम) होते हैं और एक प्रक्रिया पहले एक को ताला लगा देती है और फिर दूसरी और अन्य प्रक्रियाएं उन्हें विपरीत क्रम में बंद कर देती हैं। [डेडलॉक] की परिभाषा देखें (https://en.wikipedia.org/wiki/Deadlock)। – James

+0

बहुत बढ़िया जेम्स - धन्यवाद! –

1

यदि तालिका में कभी भी अपडेट नहीं किया जाता है (केवल आवेषण) तो आप चयन को बदलने की कोशिश करना चाहेंगे - बिना किसी लॉक या रैपिंग को cftransation readuncommited में चयन करें।

जैसा कि मार्क ने कहा कि यह एक डीबी त्रुटि है जिसे कोल्डफ्यूजन और ताले नहीं चल रहे हैं। यदि जटिल चयन और अपडेट हैं तो क्लॉज कॉलम में इंडेक्स जोड़ने को जोड़ें।

+0

मैंने सुझाव देने के बारे में सोचा - अच्छा सुझाव। मुझे अभी यह धारणा मिली है कि उसका जावा आधारित "अपडेट" अपने सीएफ आधारित "डालने" के साथ हस्तक्षेप कर रहा था :) –