चयन अन्य चयन के साथ गतिरोध नहीं कर सकते, क्योंकि वे केवल साझा ताले प्राप्त करते हैं। आप कहते हैं कि हमें इस पर विचार करना चाहिए कि इन चयनों को अब 'अनन्य रीड लॉक की आवश्यकता है', लेकिन हमारे लिए इस पर विचार करना संभव नहीं है क्योंकि 1) exlusive read lock
जैसी कोई चीज नहीं है। और 2) रीड्स एक्सक्लूसिव लॉक हासिल नहीं करते हैं।
लेकिन आप एक अधिक सामान्य प्रश्न उठाते हैं, क्या सरल कथन गतिरोध कर सकते हैं। उत्तर निश्चित, शानदार है हां . निष्पादन पर ताले प्राप्त किए जाते हैं, पहले विश्लेषण नहीं किया जाता है और क्रमबद्ध किया जाता है और फिर किसी क्रम में प्राप्त किया जाता है। इंजन के लिए आवश्यक तालों को पहले से जानना असंभव होगा क्योंकि वे ऑन-डिस्क में वास्तविक डेटा पर निर्भर करते हैं, और डेटा को पढ़ने के लिए इंजन को ... डेटा को लॉक करने की आवश्यकता होती है।
अलग-अलग इंडेक्स एक्सेस ऑर्डर के कारण साधारण स्टेटमेंट्स (SELECt vs. UPDATE या SELECT vs. DELETE) के बीच गतिरोध काफी सामान्य और जांच, निदान और ठीक करने में बहुत आसान है। लेकिन ध्यान दें कि हमेशा . होता है एक लेखन ऑपरेशन शामिल है, क्योंकि पढ़ना एक दूसरे को अवरुद्ध नहीं कर सकता है। इस चर्चा के लिए, किसी चयन में UPDLOCK या XLOCK संकेत जोड़ना एक लेखन माना जाना चाहिए। आपको जॉइन की भी आवश्यकता नहीं है, एक सेकेंडरी इंडेक्स एक्सेस ऑर्डर की समस्या को अच्छी तरह से पेश कर सकता है जिससे गतिरोध हो सकता है, देखें डेडलॉक पढ़ें/लिखें ।
और अंत में, लिखना SELECT FROM A JOIN B
या लिखना SELECT FROM B JOIN A
पूरी तरह अप्रासंगिक है। क्वेरी ऑप्टिमाइज़र एक्सेस ऑर्डर को पुनर्व्यवस्थित करने के लिए स्वतंत्र है क्योंकि यह फिट दिखता है, क्वेरी का वास्तविक टेक्स्ट किसी भी तरह से निष्पादन के क्रम को लागू नहीं करता है।
अपडेट किया गया
मुझे डर है कि कोई कुकी-कटर नुस्खा नहीं है। समाधान हर मामले पर निर्भर करेगा। अंततः, डेटाबेस अनुप्रयोगों में गतिरोध जीवन का एक तथ्य है। मैं समझता हूं कि यह बेतुका लग सकता है, जैसे 'हम चंद्रमा पर उतरे लेकिन हम एक सही डेटाबेस एप्लिकेशन नहीं लिख सकते', लेकिन खेल में मजबूत कारक हैं जो बहुत अधिक गारंटी देते हैं कि अनुप्रयोगों को अंततः गतिरोध का सामना करना पड़ेगा। भाग्यशाली गतिरोध हैं द त्रुटियों से निपटने में सबसे आसान, सरल फिर से राज्य को पढ़ें, तर्क लागू करें, नया राज्य फिर से लिखें। अब कहा जा रहा है कि, कुछ अच्छे अभ्यास हैं जो गतिरोध की आवृत्ति को नाटकीय रूप से कम कर सकते हैं, इस बिंदु तक कि वे सभी गायब हो गए हैं:
- कोशिश करें कि लिखने . के लिए एक समान पहुंच पैटर्न हो . स्पष्ट रूप से परिभाषित नियम हैं जैसे कि 'एक लेनदेन हमेशा इस क्रम में टेबल होगा:
Customers
->OrderHeaders
->OrderLines
.' ध्यान दें कि लेनदेन . के अंदर आदेश का पालन किया जाना है . मूल रूप से, रैंक सभी अपने स्कीमा में टेबल और निर्दिष्ट करें कि सभी अपडेट रैंकिंग क्रम में होने चाहिए। यह अंततः कोड लिखने वाले व्यक्तिगत योगदानकर्ता के कोड अनुशासन के लिए उबलता है, क्योंकि इसे यह सुनिश्चित करना होता है कि यह लिखता है कि लेनदेन के अंदर उचित क्रम में अपडेट पाप है। - अवधि कम करें लिखता है। सामान्य ज्ञान इस प्रकार है:लेन-देन की शुरुआत में सभी पढ़ें (मौजूदा स्थिति पढ़ें), फिर तर्क को संसाधित करें और नए मूल्यों की गणना करें, फिर लेनदेन के अंत में सभी अपडेट लिखें। 'रीड-> राइट-> लॉजिक-> रीड-> राइट' जैसे पैटर्न से बचें, इसके बजाय 'रीड-> रीड-> लॉजिक-> राइट-> राइट' करें। बेशक, वास्तविक शिल्प कौशल में वास्तविक, वास्तविक, व्यक्तिगत मामलों से निपटने का तरीका शामिल है, जब स्पष्ट रूप से एक चाहिए मध्य लेन-देन लिखना है। यहां एक विशेष प्रकार के लेन-देन के बारे में एक विशेष नोट कहा जाना चाहिए:वे एक कतार द्वारा संचालित होते हैं, जो बहुत परिभाषा के अनुसार कतार से (=एक लेखन) को हटाकर अपनी गतिविधि शुरू करते हैं। इन अनुप्रयोगों को लिखना और त्रुटियों (विशेष रूप से गतिरोध) के लिए हमेशा कुख्यात कठिन थे, सौभाग्य से इसे करने के तरीके हैं, देखें टेबल्स को क्यू के रूप में उपयोग करना ।
- पढ़ने की मात्रा कम करें। टेबल स्कैन द . हैं गतिरोध का सबसे प्रचलित कारण। उचित अनुक्रमण न केवल गतिरोध को समाप्त करेगा, बल्कि प्रक्रिया में प्रदर्शन को भी बढ़ावा दे सकता है।
- स्नैपशॉट आइसोलेशन . गतिरोध से बचने के संबंध में यह सबसे नज़दीकी चीज़ है जो आपको मुफ्त दोपहर के भोजन के लिए मिलेगी। मैंने जानबूझकर इसे अंतिम रूप दिया, क्योंकि यह मुखौटा . हो सकता है अन्य समस्याओं (जैसे अनुचित अनुक्रमण) को ठीक करने के बजाय।
LockCustomerByXXX
. के साथ इस समस्या को हल करने का प्रयास कर रहे हैं दृष्टिकोण मुझे डर है काम नहीं करता है। निराशावादी लॉकिंग स्केल नहीं करता है। आशावादी संगामिति
अपडेट द . हैं अगर आप किसी भी प्रकार का अच्छा प्रदर्शन करना चाहते हैं तो जाने का रास्ता।