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

एक IX-लॉक, InnoDB में दूसरे IX-लॉक के साथ संगत क्यों है?

https://dev.mysql.com/doc /refman/5.6/hi/innodb-lock-modes.html कहते हैं:

इसका मतलब है कि कई धागे IX ताले प्राप्त कर सकते हैं। ये ताले टेबल-लेवल पर हैं, न कि रो-लेवल पर। IX लॉक का अर्थ है कि इसे धारण करने वाला थ्रेड कुछ पंक्तियों को कहीं अपडेट करना चाहता है मेज पर। IX ताले केवल पूर्ण-तालिका संचालन को अवरुद्ध करने के लिए हैं।

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

पंक्ति-स्तर के ताले का प्रयास करने से पहले DML संचालन को पहले IX लॉक प्राप्त करना होगा। इसका कारण यह है कि आप नहीं चाहते कि ALTER TABLE . के दौरान DML को अनुमति दी जाए प्रगति पर है, या जबकि किसी अन्य सूत्र ने LOCK TABLES...WRITE . किया है ।

पंक्ति-स्तरीय परिवर्तन जैसे UPDATE , DELETE , SELECT..FOR UPDATE IX लॉक द्वारा अवरुद्ध नहीं हैं। वे अन्य पंक्ति-स्तरीय परिवर्तनों, या वास्तविक पूर्ण तालिका लॉक (LOCK TABLES द्वारा अवरुद्ध हैं। , या कुछ डीडीएल स्टेटमेंट)। लेकिन उन टेबल ऑपरेशंस के अलावा, डीएमएल चलाने वाले कई थ्रेड शायद समवर्ती रूप से काम कर सकते हैं, जब तक कि वे प्रत्येक पंक्तियों के सेट पर काम कर रहे हों जो ओवरलैप नहीं होते हैं।

अपनी टिप्पणी दें:

दूसरा SELECT...FOR UPDATE IX लॉक पर प्रतीक्षा अवरुद्ध नहीं है, यह पंक्तियों पर X (पंक्ति-स्तर) लॉक पर प्रतीक्षा कर रहा है जो पहले से ही किसी अन्य थ्रेड में एक्स-लॉक द्वारा लॉक किया गया है।

मैंने अभी यह कोशिश की और फिर मैंने SHOW ENGINE INNODB STATUS चलाया ताकि मैं अवरुद्ध लेनदेन देख सकूं:

---TRANSACTION 71568, ACTIVE 12 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 10, OS thread handle 140168480220928, query id 288 localhost root statistics
select * from test where id=1 for update
------- TRX HAS BEEN WAITING 12 SEC FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 802 page no 3 n bits 72 index `PRIMARY` of table `test`.`test` 
trx id 71568 lock_mode X locks rec but not gap waiting

देखना? यह कहता है कि यह प्राथमिक कुंजी अनुक्रमणिका पर lock_mode X के साथ लॉक दिए जाने की प्रतीक्षा कर रहा है तालिका का test . वह एक पंक्ति-स्तरीय लॉक है।

LOCK IN SHARE MODE . के बारे में अपने भ्रम को दूर करें :

आप तीन के बारे में बात कर रहे हैं SELECT . के स्तर ।

  • SELECT कोई ताले का अनुरोध नहीं करता है। कोई ताला इसे अवरुद्ध नहीं करता है, और यह किसी अन्य ताले को अवरुद्ध नहीं करता है।
  • SELECT ... LOCK IN SHARE MODE टेबल पर एक आईएस लॉक का अनुरोध करता है, और फिर एस उन पंक्तियों पर लॉक करता है जो इंडेक्स स्कैन से मेल खाते हैं। एकाधिक थ्रेड्स एक टेबल पर IS लॉक या IX लॉक रख सकते हैं। एकाधिक थ्रेड एक ही समय में S लॉक धारण कर सकते हैं।
  • SELECT ... FOR UPDATE टेबल पर एक IX लॉक का अनुरोध करता है, और फिर X उन पंक्तियों पर लॉक करता है जो इंडेक्स स्कैन से मेल खाते हैं। X ताले अनन्य हैं जिसका अर्थ है कि उनके पास X लॉक रखने के लिए कोई अन्य धागा नहीं हो सकता या एक ही पंक्ति पर एक S लॉक।

लेकिन न तो X और न ही S लॉक IX या IS लॉक की परवाह करते हैं।

इस सादृश्य के बारे में सोचें:एक संग्रहालय की कल्पना करें।

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

अपनी यात्रा के दौरान, गंभीर कला प्रशंसक जितना हो सके पेंटिंग के करीब पहुंचेंगे, और लंबी अवधि के लिए इसका अध्ययन करेंगे। वे अन्य कला प्रशंसकों को उसी पेंटिंग से पहले उनके बगल में खड़े होने देने में प्रसन्न हैं। इसलिए वे SELECT ... LOCK IN SHARE MODE . कर रहे हैं और उनके पास "एस" ताले हैं क्योंकि वे कम से कम नहीं चाहते कि पेंटिंग का अध्ययन करते समय उन्हें बदला जाए।

क्यूरेटर एक पेंटिंग की जगह ले सकते हैं, लेकिन वे गंभीर कला प्रशंसकों के प्रति विनम्र हैं, और वे तब तक इंतजार करेंगे जब तक कि ये दर्शक नहीं हो जाते और आगे बढ़ जाते हैं। इसलिए वे SELECT ... FOR UPDATE . करने का प्रयास कर रहे हैं (या बस UPDATE या DELETE ) वे इस समय "एक्स" लॉक प्राप्त करेंगे, यह कहते हुए थोड़ा साइन अप करके "प्रदर्शन को फिर से डिज़ाइन किया जा रहा है।" गंभीर कला प्रशंसक अच्छी रोशनी और कुछ वर्णनात्मक पट्टिका के साथ कला को उचित तरीके से प्रस्तुत करते हुए देखना चाहते हैं। वे पास आने से पहले रीडिज़ाइन किए जाने की प्रतीक्षा करेंगे (यदि वे कोशिश करते हैं तो उन्हें लॉक प्रतीक्षा मिल जाती है)।

इसके अलावा, आप शायद एक संग्रहालय में रहे हैं जहाँ अधिक आकस्मिक आगंतुक भटकते हैं, अन्य लोगों के रास्ते से बाहर रहने की कोशिश करते हैं। वे कमरे के बीच से पेंटिंग को देखते हैं, बहुत करीब से नहीं। वे उसी पेंटिंग को देख सकते हैं जो अन्य दर्शक देख रहे हैं, और वे गंभीर कला प्रशंसकों के कंधों पर झांक सकते हैं, उन चित्रों को भी देख सकते हैं जिन्हें देखा जा रहा है। जब वे पेंटिंग्स की जगह ले रहे होते हैं तो वे क्यूरेटर पर भी चकमा दे सकते हैं (उन्हें कोई परवाह नहीं है अगर वे एक ऐसी पेंटिंग देखते हैं जिसे अभी तक माउंट नहीं किया गया है और ठीक से प्रकाशित नहीं किया गया है)। इसलिए ये आकस्मिक आगंतुक किसी को भी नहीं रोकते हैं, और कोई भी उनके देखने को अवरुद्ध नहीं करता है। वे बस SELECT कर रहे हैं और वे किसी भी ताले का अनुरोध नहीं करते हैं।

लेकिन निर्माण श्रमिक भी हैं जो दीवारों और सामानों को फाड़ने वाले हैं, लेकिन वे काम नहीं करेंगे जबकि इमारत में कोई है। वे सभी के जाने का इंतजार करेंगे, और एक बार अपना काम शुरू करने के बाद, वे किसी को भी अंदर नहीं जाने देंगे। इस तरह IS और IX बैज की उपस्थिति DDL (निर्माण कार्य) को अवरुद्ध करती है, और इसके विपरीत।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django कोड या MySQL ट्रिगर

  2. MySQL में संग्रहीत फ़्लोट मान गड़बड़ा जाता रहता है

  3. MySQL - क्वेरी ऑर्डर करें और शीर्ष पर एक यादृच्छिक पंक्ति प्रदर्शित करें

  4. mysql में समूह प्रकार के भीतर

  5. मैं मैक पर कमांड लाइन MySQL क्लाइंट कैसे स्थापित करूं?