क्या दो लॉकिंग के बीच सटीक अंतर नहीं है खंड पढ़ें:MySQL InnoDB: UPDATE` और `शेयर MODE` में बंद के लिए` के बीच अंतर
SELECT ... FOR UPDATE
और
SELECT ... LOCK IN SHARE MODE
और तुम क्यों करेंगे एक दूसरे पर उपयोग करने की आवश्यकता है?
क्या दो लॉकिंग के बीच सटीक अंतर नहीं है खंड पढ़ें:MySQL InnoDB: UPDATE` और `शेयर MODE` में बंद के लिए` के बीच अंतर
SELECT ... FOR UPDATE
और
SELECT ... LOCK IN SHARE MODE
और तुम क्यों करेंगे एक दूसरे पर उपयोग करने की आवश्यकता है?
मैं दोनों के बीच अंतर को समझने की कोशिश कर रहा हूं। उम्मीद है कि मुझे उम्मीद है कि यह अगले व्यक्ति के लिए उपयोगी होगा।
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 से बढ़ेगा।
https://dev.mysql.com/doc/refman के अनुसार /5.7/en/innodb-locking-reads.html "उनमें से कम से कम एक डेडलॉक में समाप्त होता है" - जैसा कि आपने कहा था 2 के बजाय 1 से काउंटर में वृद्धि नहीं करना। कोई विचार क्यों डेडलॉक हो सकता है? –
[अद्यतन के लिए "वी/एस" साझा मोड में लॉक "के संभावित डुप्लिकेट: समवर्ती धागे को लॉक पंक्ति के अद्यतन" स्थिति "मान को पढ़ने की अनुमति दें] (http: // stackoverflow.com/questions/9037345/for-update-vs-lock-in-share-mode-allow-concurrent-threads-to-read-updated) –