Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

SQL अद्यतन अद्यतन चलाने के दौरान इसकी उपश्रेणी को प्रभावित करेगा?

** संपादित **

लक्ष्य तालिका से चयन करना

13.2.9.8 से। खंड से उपश्रेणियाँ:

<ब्लॉककोट>

FROM क्लॉज में उपश्रेणियाँ एक अदिश, स्तंभ, पंक्ति या तालिका लौटा सकती हैं। FROM खंड में उपश्रेणियों को सहसंबद्ध उपश्रेणियों से नहीं जोड़ा जा सकता है, जब तक कि JOIN ऑपरेशन के ON खंड के भीतर उपयोग नहीं किया जाता है।

तो, हाँ, आप उपरोक्त क्वेरी कर सकते हैं।

समस्या

यहां वास्तव में दो समस्याएं हैं। वहाँ समरूपता है, या यह सुनिश्चित करना है कि कोई और हमारे पैरों के नीचे से डेटा को नहीं बदलता है। इसे लॉकिंग के साथ संभाला जाता है। नए बनाम पुराने मूल्यों के वास्तविक संशोधन से निपटने को व्युत्पन्न तालिकाओं के साथ नियंत्रित किया जाता है।

लॉक करना

उपरोक्त आपकी क्वेरी के मामले में, InnoDB के साथ, MySQL पहले SELECT को निष्पादित करता है, और व्यक्तिगत रूप से तालिका में प्रत्येक पंक्ति पर एक रीड (साझा) लॉक प्राप्त करता है। यदि आपके पास सेलेक्ट स्टेटमेंट में WHERE क्लॉज था, तो केवल आपके द्वारा चुने गए रिकॉर्ड्स ही लॉक होंगे, जहां रेंज के कारण कोई गैप भी लॉक हो जाएगा।

रीड लॉक किसी अन्य क्वेरी को राइट लॉक प्राप्त करने से रोकता है, इसलिए रिकॉर्ड को लॉक होने पर कहीं और से अपडेट नहीं किया जा सकता है।

फिर, MySQL व्यक्तिगत रूप से तालिका में प्रत्येक रिकॉर्ड पर एक राइट (अनन्य) लॉक प्राप्त करता है। यदि आपके UPDATE स्टेटमेंट में WHERE क्लॉज होता है, तो केवल विशिष्ट रिकॉर्ड ही राइट लॉक होते हैं, और फिर से, यदि WHERE क्लॉज एक रेंज का चयन करता है, तो आपके पास एक रेंज लॉक हो जाएगी।

कोई भी रिकॉर्ड जिसमें पिछले SELECT से रीड लॉक था, स्वचालित रूप से राइट लॉक में बढ़ जाएगा।

राइट लॉक अन्य प्रश्नों को रीड या राइट लॉक प्राप्त करने से रोकता है।

आप इसे लॉक मोड में चलाकर इसे देखने के लिए इनोटॉप का उपयोग कर सकते हैं, लेनदेन शुरू कर सकते हैं, क्वेरी निष्पादित कर सकते हैं (लेकिन इसे प्रतिबद्ध न करें), और आप इनोटॉप में ताले देखेंगे। साथ ही, आप बिना Innotop के विवरण SHOW ENGINE INNODB STATUS के साथ देख सकते हैं ।

गतिरोध

यदि एक ही समय में दो इंस्टेंस चलाए गए थे, तो आपकी क्वेरी एक गतिरोध के प्रति संवेदनशील है। यदि क्वेरी A को रीड लॉक मिल गया है, तो क्वेरी B को रीड लॉक मिल गया है, क्वेरी A को क्वेरी B के रीड लॉक को रिलीज़ होने से पहले राइट लॉक प्राप्त करने के लिए प्रतीक्षा करनी होगी। हालांकि, क्वेरी बी समाप्त होने तक रीड लॉक जारी नहीं करेगा, और यह तब तक समाप्त नहीं होगा जब तक कि यह लिखने वाले ताले प्राप्त नहीं कर लेता। क्वेरी A और क्वेरी B गतिरोध में हैं, और इसलिए, एक गतिरोध है।

इसलिए, आप एक स्पष्ट टेबल लॉक करना चाह सकते हैं, दोनों रिकॉर्ड लॉक की भारी मात्रा से बचने के लिए (जो स्मृति का उपयोग करता है और प्रदर्शन को प्रभावित करता है), और एक गतिरोध से बचने के लिए।

एक वैकल्पिक तरीका यह है कि आप अपने आंतरिक चयन पर SELECT... FOR UPDATE का उपयोग करें। यह सभी पंक्तियों पर राइट लॉक के साथ शुरू होता है, बजाय इसके कि इसे पढ़ने और आगे बढ़ाने के साथ शुरू किया जाए।

व्युत्पन्न तालिकाएं

आंतरिक चयन के लिए, MySQL एक व्युत्पन्न अस्थायी तालिका बनाता है। एक व्युत्पन्न तालिका डेटा की एक वास्तविक गैर-अनुक्रमित प्रति है जो अस्थायी तालिका में रहती है जो स्वचालित रूप से MySQL द्वारा बनाई जाती है (जैसा कि एक अस्थायी तालिका के विपरीत जिसे आप स्पष्ट रूप से बनाते हैं और इसमें अनुक्रमणिका जोड़ सकते हैं)।

चूंकि MySQL एक व्युत्पन्न तालिका का उपयोग करता है, वह अस्थायी पुराना मान है जिसे आप अपने प्रश्न में संदर्भित करते हैं। दूसरे शब्दों में, यहाँ कोई जादू नहीं है। MySQL इसे वैसे ही करता है जैसे आप इसे कहीं और करेंगे, अस्थायी मान के साथ।

आप अपने अद्यतन विवरण (MySQL 5.6+ में समर्थित) के विरुद्ध EXPLAIN करके व्युत्पन्न तालिका देख सकते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. शीर्ष n प्रतिशत शीर्ष n%

  2. 9i क्लाइंट से 11g डेटाबेस से कनेक्ट करते समय ORA-01017 अमान्य उपयोगकर्ता नाम/पासवर्ड

  3. राउनम का उपयोग कैसे करें

  4. 1985-02-07T00:00:00.000Z (ISO8601) को Oracle में दिनांक मान में कैसे बदलें?

  5. ORA-011033 का समाधान कैसे करें:ORACLE आरंभीकरण या शटडाउन प्रगति पर है