2015-09-28 4 views
6

क्या दो लॉकिंग के बीच सटीक अंतर नहीं है खंड पढ़ें:MySQL InnoDB: UPDATE` और `शेयर MODE` में बंद के लिए` के बीच अंतर

SELECT ... FOR UPDATE 

और

SELECT ... LOCK IN SHARE MODE 

और तुम क्यों करेंगे एक दूसरे पर उपयोग करने की आवश्यकता है?

+0

[अद्यतन के लिए "वी/एस" साझा मोड में लॉक "के संभावित डुप्लिकेट: समवर्ती धागे को लॉक पंक्ति के अद्यतन" स्थिति "मान को पढ़ने की अनुमति दें] (http: // stackoverflow.com/questions/9037345/for-update-vs-lock-in-share-mode-allow-concurrent-threads-to-read-updated) –

उत्तर

13

मैं दोनों के बीच अंतर को समझने की कोशिश कर रहा हूं। उम्मीद है कि मुझे उम्मीद है कि यह अगले व्यक्ति के लिए उपयोगी होगा।

LOCK IN SHARE MODE और FOR UPDATE दोनों सुनिश्चित करें कि कोई अन्य लेन-देन चयनित पंक्तियों को अपडेट नहीं कर सकता है। डेटा पढ़ने के दौरान दोनों के बीच का अंतर यह है कि वे ताले का इलाज कैसे करते हैं।

LOCK IN SHARE MODE किसी अन्य लेनदेन को उसी पंक्ति को पढ़ने से रोकता नहीं है जो लॉक था।

FOR UPDATE एक ही पंक्ति के अन्य लॉकिंग पठन को रोकता है (गैर-लॉकिंग रीड अभी भी उस पंक्ति को पढ़ सकते हैं; LOCK IN SHARE MODE और FOR UPDATE रीड लॉक कर रहे हैं)।

काउंटर अपडेट करने जैसे मामलों में यह महत्वपूर्ण है, जहां आप 1 कथन में मान पढ़ते हैं और दूसरे में मूल्य अपडेट करते हैं। यहां LOCK IN SHARE MODE का उपयोग करने से 2 लेन-देन समान प्रारंभिक मान को पढ़ने की अनुमति देंगे। तो अगर दोनों लेनदेन द्वारा काउंटर को 1 से बढ़ाया गया था, तो अंतिम गणना केवल 1 तक बढ़ सकती है - क्योंकि दोनों लेन-देन शुरू में उसी मूल्य को पढ़ते हैं।

FOR UPDATE का उपयोग करके दूसरे लेनदेन को मूल्य पढ़ने से पहले लेनदेन को बंद कर दिया होगा। यह सुनिश्चित करेगा कि काउंटर 2 से बढ़ेगा।

+0

https://dev.mysql.com/doc/refman के अनुसार /5.7/en/innodb-locking-reads.html "उनमें से कम से कम एक डेडलॉक में समाप्त होता है" - जैसा कि आपने कहा था 2 के बजाय 1 से काउंटर में वृद्धि नहीं करना। कोई विचार क्यों डेडलॉक हो सकता है? –

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