2008-10-22 18 views
5

concurrency समस्या को संभालने के लिए, लॉकिंग है - लॉकिंग का कोई भी रूप, चाहे वह पंक्ति, तालिका या डेटाबेस एक अच्छा समाधान लॉक कर रहा हो?समेकन को संभालने के लिए लॉक करना - एक अच्छा विचार?

यदि नहीं, तो सहमति कैसे हल करें?

उत्तर

8

यदि आप ओरेकल पर विश्वास करते हैं, नहीं, बिल्कुल नहीं। ऐसा इसलिए है क्योंकि ओरेकल इससे बचने के लिए बहुत अधिक समय तक चला गया।

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

अभ्यास लॉकिंग आमतौर पर ठीक है यदि बहुत अधिक विवाद नहीं है, तो किसी भी समवर्ती प्रोग्रामिंग के साथ ही। यदि पंक्ति/पृष्ठ/तालिका के लिए बहुत अधिक विवाद है (कई डेटाबेस सर्वर पूरे-डीबी लॉकिंग नहीं करते हैं), तो यह लेन-देन को बदले में बदले में निष्पादित कर देगा।

ओरेकल पंक्ति-संस्करण का उपयोग करता है, जहां इसे लिखने के लिए पंक्ति को लॉक करने की बजाय, पंक्ति का एक नया संस्करण इसके बजाय बनाया जाता है।पाठकों को जो उनके पढ़ने को दोहराने की ज़रूरत है उन्हें याद है कि वे पंक्ति के किस संस्करण को पढ़ते हैं। हालांकि, एक पाठक तब होगा जब एक पाठक जो इसके पाठ को याद कर रहा है, उस पंक्ति को अद्यतन करने का प्रयास करता है जिसे किसी अन्य लेखक द्वारा अपडेट किया गया है क्योंकि इस लेनदेन ने इसे पढ़ा है; यह खोए गए अपडेट को रोकने के लिए है। यह सुनिश्चित करने के लिए कि आप एक पंक्ति अपडेट कर सकते हैं, आपको कहना होगा कि चयन अद्यतन के लिए है; यदि आप ऐसा करते हैं, तो यह लॉक लेता है - केवल एक लेनदेन एक समय में अद्यतन के लिए एक पंक्ति पकड़ सकता है, और एक विवादित लेनदेन का इंतजार करना पड़ता है।

SQL सर्वर 2005 और बाद में समर्थन स्नैपशॉट अलगाव, जो पंक्ति-संस्करण के लिए उनका नाम है। फिर, आपको अपडेट लॉक के लिए पूछना चाहिए यदि आपको कुछ डेटा अपडेट करने की आवश्यकता है जिसे आपने अभी पढ़ा है - SQL सर्वर में, (UPDLOCK) के साथ उपयोग करें।

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

आम तौर पर मैं थ्रेडिंग के साथ ही सुझाव दूंगा - ताले के साथ जाएं जब तक कि आप यह साबित न कर सकें कि वे स्केलेबिलिटी समस्या पैदा कर रहे हैं, फिर सबसे महत्वपूर्ण अनुभाग लॉक-फ्री बनाने के तरीके के बारे में जानें।

1

मुझे नहीं लगता, क्योंकि यह "नीचे" है और आपका एप्लिकेशन अधिक जटिल बनाता है। अधिकांश भाषाओं में एक्सेलेंट कंसुरेंसी हैंडलिंग तकनीकें होती हैं, और फिर भी सबसे अच्छा तरीका कोड लिखना है जो "मूल रूप से" समेकन को संभाल सकता है। http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html

+0

कोड जो "मूल रूप से" समेकन को संभाल सकता है ... किसी भी सुझाव पर कैसे? – Graviton

+0

मुझे लगता है कि वह प्रोग्रामिंग भाषा या पुस्तकालय जैसी सुविधाओं का उपयोग कर रहा है जैसे java.util.concurrent। –

+0

हां। यह भी देखें http://java.sun.com/docs/books/tutorial/essential/concurrency/index.html – Rolf

0

आप अपने आवेदन में संगामिति को संभालने के लिए मतलब है, या एक संगामिति समस्या आप डेटाबेस के साथ कर रहे हल करने के लिए:

जावा में संगामिति के बारे में अधिक जानकारी के लिए

। यदि पूर्व, यह मुझे एक अच्छे दृष्टिकोण के रूप में नहीं रोकता है। यदि उत्तरार्द्ध, यह आपके स्कीमा को फिर से इंजीनियरिंग किए बिना आपका एकमात्र उत्तर हो सकता है।

1

डेटाबेस लॉकिंग - तालिका या पंक्ति लॉकिंग के विपरीत - समरूपता से निपटने का एक बुरा तरीका है; यह समवर्ती नियमों का पालन करता है।

+0

क्या आप अपने उत्तर पर विस्तार कर सकते हैं? इससे निपटने का यह एक बुरा तरीका है क्योंकि यह इसे रोकता है? – DOK

+0

मुझे लगता है कि उसका मुद्दा यह है कि आप डेटाबेस को लॉक करते हैं, आपके पास लॉन्च होने पर समरूपता नहीं है। –

+0

@ dok1: मिशेल का यह अधिकार है। यदि आप डेटाबेस को लॉक करते हैं (विशेष मोड में), तो कोई समवर्ती पहुंच नहीं है। यदि आप रीड-ओनली मोड में डेटाबेस लॉक करते हैं, तो आपके पास डेटाबेस पढ़ने वाले कई लोग हो सकते हैं, लेकिन कोई भी इसे संशोधित नहीं कर सकता है। (मुझे एक डीबीएमएस पता है जो डेटाबेस पर विशेष ताले प्रदान करता है।) –

2

आपको पहले अपना उद्देश्य परिभाषित करना होगा। समवर्ती अनुरोध के मामले में आप अंतिम उपयोगकर्ता या पहले उपयोगकर्ता को जीतना चाहते हैं। डाटाबेस लॉकिंग निश्चित रूप से एक खराब तरीका है। तालिका/पंक्तियों को जितनी देर हो सके लॉक करने का प्रयास करें और लॉक एएसपी जारी करें।

1

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

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