2011-07-07 22 views
16

मैं this article from dev.mysql पढ़ा है।शेयर मोड में चयन लॉक

कि पेज में

कि जब उपयोग अद्यतन के लिए चुन सकते हैं और शेयर मोड में लॉक का उपयोग न एक उदाहरण है और

कहते हैं यहां, शेयर मोड में लॉक एक अच्छा समाधान नहीं है क्योंकि अगर दो उपयोगकर्ताओं को पढ़ने के एक ही समय पर काउंटर, उनमें से कम से कम एक जब काउंटर अद्यतन करने के लिए यह प्रयास गतिरोध में समाप्त होता है

, जबकि इस पृष्ठ की पहली पंक्ति कहते हैं

का चयन करें ... शेयर मोड में लॉक: पंक्तियों पढ़ें नवीनतम उपलब्ध हैं, ** तो अगर वे एक और लेन-देन के हैं ** नहीं है अभी तक प्रतिबद्ध, ब्लॉक पढ़ा जब तक कि लेनदेन समाप्त होता है

वहाँ एक विरोधाभास है?

मेरा मतलब दो उपयोगकर्ताओं beacause एक ही समय में काउंटर पढ़ अगर वे एक और लेन-देन के लिए पढ़ा ब्लॉकों हैं जब तक कि लेनदेन समाप्त होता है न।

उत्तर

18

अगर वहाँ एक और लेन-देन, तो उस पंक्ति, का चयन करें ... शेयर मोड इंतजार में बंद कर संशोधित किया गया है। यदि पंक्ति संशोधित नहीं है, तो यह प्रतीक्षा नहीं करता है। जो पहले स्थिति की ओर जाता है, कि 2 लेन-देन का चयन कर सकते हैं ... शेयर मोड में लॉक, लेकिन उनमें से कोई रिकॉर्ड (गतिरोध)

+0

तो अद्यतन प्रतीक्षा के लिए चयन करें यदि ब्लॉक्ड पंक्ति संशोधित या संशोधित करने से पहले उपयोगकर्ता 1 द्वारा संशोधित नहीं किया गया है, तो साझा मोड में लॉक होने से पहले केवल तभी प्रतीक्षा करें जब अवरुद्ध पंक्ति को उपयोगकर्ता 1 द्वारा प्रतिबद्ध किया गया हो? – user677900

+4

अंतर आप एक को चुनें और साथ का चयन करें ... शेयर मोड में ताला 2 लेन-देन में एक ही रिकॉर्ड कर सकते हैं, लेकिन आप कर सकते हैं का चयन के साथ नहीं ... अद्यतन के लिए। अपडेट के लिए किसी अन्य चयन को अपडेट करने के लिए चुनें या उसी रिकॉर्ड पर शेयर मोड में लॉक का चयन करें। –

11

अद्यतन कर सकते हैं इस कोशिश करो। दो टर्मिनल खोलें उदा। विंडोज, xterm, लिनक्स में कंसोल में powershell, .... MySQL से जोड़ना:

तालिका child_codes (MySQL documentation से लिया गया) बनाने

mysql> create table child_codes (counter_field integer); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into child_codes set counter_field = 1; 
Query OK, 1 row affected (0.00 sec) 

session 1 (terminal 1):    session 2 (terminal 2):                   

              mysql> start transaction; 
              Query OK, 0 rows affected (0.00 sec) 

              mysql> select counter_field from child_codes 
                 lock in share mode; 
              +---------------+ 
              | counter_field | 
              +---------------+ 
              |    1 | 
              +---------------+ 
              1 row in set (0.00 sec) 

mysql> start transaction; 
Query OK, 0 rows affected (0.00 sec) 
mysql> select counter_field from 
      child_codes lock in share mode; 
+---------------+ 
| counter_field | 
+---------------+ 
|    1 | 
+---------------+ 

              mysql> update child_codes set counter_field = 2; 
              ERROR 1205 (HY000): Lock wait timeout exceeded; 
              try restarting transaction 

मैं भी सोचा था कि अन्य लेनदेन शेयर में क्वेरी का चयन ताला कार्यान्वित करता है, तो मोड यह क्वेरी अवरुद्ध है (अन्य लेनदेन के लिए प्रतिबद्ध या रोलबैक के लिए प्रतीक्षा)। लेकिन Darhazer की तरह का उल्लेख किया गया है यदि पंक्ति संशोधित नहीं है, तो यह का इंतजार नहीं करता है। मेरा मानना ​​है कि इस व्यवहार का उल्लेख MySQL दस्तावेज़ में किया जाना चाहिए।

+0

उदाहरण अव्यवहारिक और विरोधाभास प्रतीत होता है, "* अन्य सत्र पंक्तियों को पढ़ सकते हैं, लेकिन जब तक आपका लेनदेन नहीं होता तब तक उन्हें संशोधित नहीं किया जा सकता है। यदि इनमें से कोई भी पंक्ति किसी अन्य लेनदेन द्वारा बदली गई है जो अभी तक प्रतिबद्ध नहीं है, तो आपकी क्वेरी उस तक प्रतीक्षा कर रही है लेनदेन समाप्त होता है और फिर नवीनतम मानों का उपयोग करता है। * "किसी अन्य लेनदेन को लॉक जारी करने पर कोई अवरोध या डेडलॉक नहीं पता होना चाहिए। http://dev.mysql.com/doc/refman/5.5/en/innodb-locking-reads.html – Tiny

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