डेटाबेस में दौड़ की स्थितियों के लिए आप कैसे परीक्षण करते हैं?


30

मैं यह सुनिश्चित करने के लिए डेटाबेस कोड लिखने की कोशिश करता हूं कि यह दौड़ की स्थिति के अधीन नहीं है, यह सुनिश्चित करने के लिए कि मैंने सही पंक्तियों या तालिकाओं को बंद कर दिया है। लेकिन मुझे अक्सर आश्चर्य होता है: क्या मेरा कोड सही है? क्या किसी भी मौजूदा दौड़ की स्थिति को प्रकट करने के लिए मजबूर करना संभव है? मैं यह सुनिश्चित करना चाहता हूं कि यदि वे उत्पादन के माहौल में होते हैं तो मेरा आवेदन सही काम करेगा।

मुझे आम तौर पर पता है कि कौन से समवर्ती प्रश्न में समस्या होने की संभावना है, लेकिन मुझे नहीं पता कि उन्हें सही तरीके से देखने के लिए समवर्ती रूप से चलाने के लिए मजबूर करना है कि क्या सही व्यवहार होता है (जैसे मैंने सही प्रकार के लॉक का उपयोग किया है), कि सही त्रुटियां हैं फेंक दिया, आदि।

नोट: मैं PostgreSQL और पर्ल का उपयोग करता हूं, इसलिए यदि इसे उदारतापूर्वक उत्तर नहीं दिया जा सकता है तो संभवतः इसे इस तरह से पुनर्प्राप्त किया जाना चाहिए।

अद्यतन: मैं इसे पसंद करूंगा यदि समाधान प्रोग्रामेटिक था। इस तरह से मैं यह सुनिश्चित करने के लिए स्वचालित परीक्षण लिख सकता हूं कि प्रतिगमन नहीं हैं।


"रेस कंडीशन" से क्या आपका मतलब "गतिरोध" है?
गयूस

2
@Gaius ... नहीं, हालांकि मुझे विश्वास है कि कुछ दौड़ की स्थितियों का एक संभावित परिणाम है
xenoterracide

एक डेटाबेस में @Gaius की दौड़ की स्थिति तालिका बनाने से पहले एक तालिका को गिराने या डालने से पहले एक पंक्ति को अपडेट करने जैसे काम कर रही होगी। आम तौर पर मुझे लगता है कि यह डेटाबेस के बाहर आवेदन तर्क द्वारा नियंत्रित किया जाता है।
मार्क डी

डालने से पहले एक पंक्ति को अद्यतन करना? यह एक db समस्या का कारण नहीं होगा। कोई भी दौड़ की स्थिति किसी पंक्ति को लाने और उसे अपडेट करने जैसी नहीं होगी, लेकिन आपकी पंक्ति के लेट हो जाने के बाद किसी अन्य उपयोगकर्ता को अपडेट करने से पहले, लेकिन आपके अपडेट को संसाधित करने से पहले।
एक्सनोटेरासाइड

1
@ मर्कड - नहीं, कई प्रकार की दौड़ स्थितियां हैं जो आपके डेटाबेस में काम की परमाणु इकाई को गलत तरीके से घेरने से उत्पन्न होती हैं। यहाँ एक उदाहरण है। याद रखें, "दौड़ की स्थिति या दौड़ का खतरा एक इलेक्ट्रॉनिक प्रणाली या प्रक्रिया में एक दोष है जिससे प्रक्रिया का उत्पादन या परिणाम अप्रत्याशित रूप से और गंभीर रूप से अन्य घटनाओं के अनुक्रम या समय पर निर्भर करता है ।" ( स्रोत )
निक चामास

जवाबों:


11

मैं अपने टी-एसक्यूएल मॉड्यूल के साथ हर समय ऐसा करता हूं।

अनिवार्य रूप से, आपको बस कुछ ही मिनटों के लिए अपने मॉड्यूल को दो या दो से अधिक कनेक्शनों से लूप में चलाना होगा । आमतौर पर, सभी संभावित समस्याएं कुछ ही मिनटों में सामने आती हैं, यह मानते हुए कि आपके पास सभ्य सीपीयू के साथ एक SQL सर्वर बॉक्स है।

मैंने यहाँ और यहाँ कुछ उदाहरण लिखे हैं


4

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

यदि यह कीचड़ के रूप में स्पष्ट लगता है, तो ऐसा कहने में संकोच न करें ;-)


क्या आप एक स्टेप बाय स्टेप उदाहरण दे सकते हैं? और क्या प्रोग्राममैटिक टेस्ट को एक ही काम करने के लिए लिखा जा सकता है?
xenoterracide

1

रेस की स्थितियों में निष्पादन के कई धागे की आवश्यकता होती है, इसलिए इकाई परीक्षण के लिए आपको एक या एक से अधिक थ्रेड शुरू करने में सक्षम होने की आवश्यकता होगी। ओरेकल में मैं एक दूसरे उपयोगकर्ता को अनुकरण करने के लिए एक प्रक्रिया को चलाने के लिए DBMS_Scheduler का उपयोग करेगा। यदि PostgreSQL / Perl के पास प्रोग्राम को दूसरी प्रक्रिया शुरू करने का एक तरीका है, तो आपको इस तरह से कुछ करने में सक्षम होना चाहिए:

प्रक्रिया 1 प्रक्रिया 2

प्रक्रिया 2 शुरू करें। >>                            
काम करने के लिए 2 की अनुमति देने में देरी। 
। पंक्तियों को लॉक करें या डेटा बदलें।
। यह काम करने के लिए 1 की अनुमति देने में देरी।
पंक्तियों को लॉक करने या डेटा बदलने का प्रयास करें। ।
उचित हैंडलिंग सुनिश्चित करने के लिए जाँच करें। ।
समाप्त होता है। ।
                                                समाप्त होता है।

दौड़ की परिस्थितियों को कैसे संभालना है और अधिक महत्वपूर्ण बात यह है कि यूनिट परीक्षण कैसे करें, यह सोचकर देखना अच्छा है।


मैं ऐसे परीक्षणों का वर्णन इकाई परीक्षणों के रूप में नहीं करूँगा, क्योंकि इकाई परीक्षणों को हर बार ठीक उसी तरह से चलना चाहिए। रेस की स्थितियाँ रुक-रुक कर होने वाली प्रक्रियाओं को रोकती हैं, हर बार ठीक उसी तरह से नहीं।
एके

@AlexKuznetsov आप सही हैं कि अनपेक्षित दौड़ की स्थितियाँ उन्हें स्वयं को रुक-रुक कर दिखा सकती हैं, हालाँकि ओपी एक्सपेक्टेड स्थितियों का हवाला दे रहा है, उनका मानना ​​है कि कोड संभालना जरूरी है । इन विशिष्ट स्थितियों को ठीक से पुन: प्रस्तुत किया जा सकता है और हैंडलिंग को एक इकाई परीक्षण के साथ सत्यापित किया जा सकता है।
लेह रिफ़ेल

-2

जब तक आप पंक्तियों को लॉक नहीं करते हैं, तब तक आपको रेस कंडोमेशन नहीं करना चाहिए क्योंकि आमतौर पर ऐसा तब होता है जब कोई लॉकिंग नहीं होती है।

लेकिन यदि कोई प्रश्न आपके प्रश्न को बहुत लंबे समय तक रोक देता है तो आप गतिरोध में पड़ सकते हैं।

डेटाबेस के बढ़ने पर प्रश्नों के समय के अनुसार परीक्षण करना कठिन है।

क्वेरी जो परीक्षण डेटा की 100 000 पंक्तियों के साथ ठीक काम करती हैं, 10 000 000 पंक्तियों के साथ चार्ट से दूर जाती है।

इस तरह की समस्या को पहले से पता करना बहुत मुश्किल हो सकता है, लेकिन कई डीबी में धीमे प्रश्नों की पहचान करने की कुछ विधि है।

उस सीमा का उपयोग करके आप पर्याप्त चेतावनी के साथ किसी भी समस्या को हल करने में सक्षम होना चाहिए।

यदि आप अपनी खुद की, इसकी एक और कहानी पर ताला लगाते हैं, लेकिन वहाँ मैं मदद नहीं कर सकता।


@darioo योग्य मुझे लगा कि शायद wn किसी चीज़ के लिए एक परिचित था ... idk का क्या मतलब होगा "वह अपने दम पर ताला लगाता है" अगर उसका मतलब ओआरएम के साथ नहीं है, तो मैंने कोड की जांच की मेरा ओआरएम आउटपुट यह निश्चित रूप से नहीं करता है। सही बंद। जो एक कारण है कि मैं संभावित दौड़ हालत परिदृश्य का परीक्षण करने में सक्षम होना चाहता हूं।
xenoterracide

हाँ, मेरा मतलब है, और आम तौर पर डेटाबेस ड्राइवर लॉकिंग, रो, टेबल या संभवतः फ़ील्ड को संभालता है, लेकिन मैं सिर्फ इस संभावना के लिए खोल रहा हूं कि आप कुछ डीबी का उपयोग करें जो लॉकिंग को हैंडल नहीं करता है;)

.. मुझे पूरा यकीन है कि अगर मेरे पास एक मल्टीपल स्टेटमेंट ट्रांजेक्शन है, तो मेरे डीबी को पता नहीं चलेगा कि कौन सी पंक्तियों को select for update
ऑटोमैटिकली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.