यह करने से पहले InnoDB लेनदेन डेटा कहाँ संग्रहीत करता है?


12

मैंने JDBC तकनीक का उपयोग करके घर पर READ_COMMITTEDऔर READ_UNCOMMITTEDघर पर कुछ परीक्षण किए हैं ।

मैं देख रहा हूं कि READ_UNCOMMITTEDवास्तव में बिना पढ़े हुए डेटा को पढ़ा जा सकता है, उदाहरण के लिए कुछ लेनदेन के डेटा अभी तक प्रतिबद्ध नहीं हैं (एक अद्यतन-क्वेरी कर सकते हैं)।

प्रशन

  • अनक्मेज्ड डेटा कहाँ संग्रहीत किया जाता है, जैसे कि एक READ_UNCOMMITTEDलेन-देन किसी अन्य लेन-देन से अप्रयुक्त डेटा को पढ़ सकता है?
  • बिना READ_COMMITTEDलेनदेन के डेटा को पढ़ना संभव नहीं है , अर्थात "गंदा रीड" करना क्यों नहीं है? क्या तंत्र इस प्रतिबंध को लागू करता है?

जवाबों:


11

" अनकम्फ़ेड डेटा कहाँ संग्रहीत किया जाता है, जैसे कि एक READ_UNCOMMITTED ट्रांज़ैक्शन से बिना पढ़े डेटा को पढ़ा जा सकता है? "

नए अनकमिज़्ड रिकॉर्ड (क्लस्टर किए गए PK) संस्करणों को पृष्ठ पर रिकॉर्ड के "वर्तमान" संस्करण के रूप में माना जाता है। तो वे बफर पूल और / या टेबलस्पेस (जैसे tablename.ibd) में संग्रहीत किया जा सकता है। लेनदेन जो तब READ-UNCOMMITTED के अलावा किसी अन्य चीज में स्नैपशॉट / व्यू बनाने की जरूरत है, UNDO रिकॉर्ड्स ( सिस्टम टेबलस्पेस में संग्रहीत) का उपयोग करके पंक्ति के पिछले संस्करण (इतिहास सूची के बाद) का निर्माण करने की आवश्यकता है । अनकमिज़्ड रिकॉर्ड को पढ़ते समय, InnoDB को चेंज बफ़र से कुछ अनकम्फर्ड सेकंडरी इंडेक्स रिकॉर्ड्स पढ़ने की ज़रूरत पड़ सकती है और रिकॉर्ड को उपयोगकर्ता के सामने प्रस्तुत करने से पहले उन्हें लागू करना चाहिए।

यह यह व्यवहार है जो इनोबीडी में रोलबैक को महंगा बना सकता है। यह बड़ा कारक है जो लंबे समय से चल रहे निष्क्रिय लेनदेन से संभावित प्रदर्शन के मुद्दों को भी जन्म दे सकता है, जो कि अद्यतन रिकॉर्ड रख रहे हैं, क्योंकि ये लेनदेन शुद्ध संचालन को अवरुद्ध कर देंगे और पुराने रिकॉर्ड संस्करणों की इतिहास सूची बढ़ती है, और उन पुराने संस्करणों के पुनर्निर्माण के लिए UNDO रिकॉर्ड की आवश्यकता होती है मांग पर, विकास के लिए जारी रहेगा। यह नए लेन-देन को धीमा कर देता है, जिसे रिकॉर्ड के पुराने / प्रतिबद्ध संस्करण को पढ़ने की आवश्यकता होती है, क्योंकि उन्हें एक लंबी और लंबी इतिहास सूची को पार करने की आवश्यकता होती है - जो यूएनडीओ रिकॉर्ड की एक एकल लिंक की गई सूची है - और पुनर्निर्माण के लिए और अधिक काम करना है। रिकॉर्ड का पुराना संस्करण। इसलिए आप बहुत सारे CPU चक्रों का उपयोग करते हैं (आंतरिक लॉकिंग आदिमों का उल्लेख नहीं करने के लिए: mutexes, rw_locks, semaphores, आदि।

उम्मीद है कि समझ में आता है? :)

FYI करें के रूप में , MySQL 5.7 में आप UNDO टेबलस्पेस को स्थानांतरित कर सकते हैं और सिस्टम टेबलस्पेस से बाहर लॉग कर सकते हैं , और उन्हें स्वचालित रूप से काट दिया जा सकता है। वे काफी बड़े हो सकते हैं यदि आपके पास लंबे समय तक चलने वाला लेनदेन है जो शुद्ध संचालन को रोकता है, जिसके परिणामस्वरूप बहुत लंबी और कभी बढ़ती हुई इतिहास सूची लंबाई होती है। सिस्टम टेबलस्पेस में उन्हें संग्रहीत करने के लिए एक विशाल / बढ़ती ibdata1 फ़ाइल का एकमात्र सबसे सामान्य कारण था, जो बाद में उस स्थान को पुनः प्राप्त करने के लिए छोटा / सिकुड़ा / वैक्यूम किया नहीं जा सकता है।


4

तुम ने पूछा था

अनकम्फेड डेटा कहाँ संग्रहीत किया जाता है, जैसे कि एक READ_UNCOMMITTED लेनदेन किसी अन्य ट्रांज़ेक्शन से अप्रयुक्त डेटा को पढ़ सकता है?

अपने प्रश्न का उत्तर देने के लिए, आपको यह जानना होगा कि इनोबीडी आर्किटेक्चर कैसा दिखता है।

निम्न चित्र परकोना सीटीओ वादिम त्कचेंको द्वारा वर्षों पहले बनाया गया था

InnoDB वास्तुकला

माईक्यूक्यू डॉक्यूमेंटेशन के अनुसार इनोबीडी ट्रांजैक्शन मॉडल और लॉकिंग पर

एक COMMIT का अर्थ है कि वर्तमान लेनदेन में किए गए परिवर्तन स्थायी हो जाते हैं और अन्य सत्रों के लिए दृश्यमान हो जाते हैं। दूसरी ओर, एक बोलबाला कथन, वर्तमान लेनदेन द्वारा किए गए सभी संशोधनों को रद्द कर देता है। COMMIT और ROLLBACK, दोनों ही सभी InnoDB ताले जारी करते हैं जो वर्तमान लेनदेन के दौरान सेट किए गए थे।

चूंकि COMMIT और ROLLBACK डेटा दृश्यता को नियंत्रित करते हैं, READ COMMITTED और READ UNCOMMITTED को उन संरचनाओं और तंत्रों पर निर्भर रहना होगा जो परिवर्तन को रिकॉर्ड करते हैं

  1. रोलबैक सेगमेंट / अनडू स्पेस
  2. फिर से लॉग
  3. तालिका के विरुद्ध अंतराल लॉक किए गए

रोलबैक सेगमेंट और पूर्ववत् स्थान को पता होगा कि परिवर्तन लागू होने से पहले डेटा क्या बदला हुआ दिखता था। Redo Logs को पता होगा कि डेटा अपडेट होने के लिए किन बदलावों को आगे बढ़ाया जाना है।

आपने भी पूछा

बिना पढ़े डेटा को पढ़ने के लिए READ_COMMITTED लेन-देन के लिए यह संभव क्यों नहीं है, अर्थात "गंदा पढ़ना"? क्या तंत्र इस प्रतिबंध को लागू करता है?

Redo Logs, Undo Space और Locked रो प्ले में आते हैं। आपको यह भी सोचना चाहिए कि वह InnoDB बफ़र पूल (जहाँ आप गंदे पृष्ठों को innodb_max_dirty_pages_pct , innodb_buffer_pool_pages_dirty और innodb_buffer_pool_bytes_dirty से माप सकते हैं )।

इसके प्रकाश में, READ COMMITTED को पता होगा कि डेटा स्थायी रूप से कैसा दिखता है। इसलिए, गंदे पन्नों की तलाश करने की आवश्यकता नहीं है जो प्रतिबद्ध नहीं थे। पढ़ें कमोड और ज्यादा कुछ नहीं होगा कि एक गंदा पढ़ा गया है जो प्रतिबद्ध है। READ UNCOMMITTED ने यह जानना जारी रखा होगा कि किन पंक्तियों को लॉक किया जाना है और डेटा को दृश्यमान बनाने के लिए कौन से रीडो लॉग को पढ़ा या अनदेखा किया गया है।

अलगाव को प्रबंधित करने के लिए पंक्तियों की लॉकिंग को पूरी तरह से समझने के लिए, कृपया InnoDB लेनदेन मॉडल और लॉकिंग पढ़ें


1
सबसे पहले, आपके जवाब और मेरी पोस्ट के संशोधन के लिए धन्यवाद ... तो, एक COMMIT से पहले, सिस्टम के अन्य उपयोगकर्ताओं के लिए परिवर्तन दिखाई नहीं दे रहे हैं? यहाँ उपयोगकर्ता का शाब्दिक अर्थ है लेन-देन, है ना? चूंकि READ UNCOMMITTED बिना पढ़े डेटा को पढ़ सकता है, इसलिए यह अलगाव स्तर इस डेटा को कहां पढ़ता है? क्या किसी डेटाबेस में किसी विशेष डेटा आइटम के लिए एक से अधिक अनकम्यूटेड डेटा का स्रोत हो सकता है? यदि ऐसा है, तो डेटा का कौन सा अप्रयुक्त टुकड़ा पढ़ा जाएगा?
शुझेंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.