2011-09-07 5 views
9

मैं एक लेनदेन में 2 प्रश्न करता हूं: चुनें (जॉइन क्लॉज युक्त) और अद्यतन। यह आवश्यक है कि चयनित पंक्तियों में डेटा अपडेट होने से पहले नहीं बदला जाए, इसलिए मैं अद्यतन अद्यतन के लिए उपयोग कर रहा हूं। मेरा सवाल है: क्या 'अपडेट के लिए' केवल खंड से निर्दिष्ट तालिका से चयनित डेटा के भाग के लिए या शामिल टेबल से डेटा के लिए भी काम करता है? मेरा डीबीएमएस MySQL है।क्या 'अपडेट के लिए' पंक्ति अवरोधन भी शामिल तालिकाओं के लिए काम करता है?

उत्तर

6

documentation बस कहता है कि ताला पंक्तियों को छोड़कर बिना पंक्तियों पर पढ़ा जाता है, इसलिए यह सभी शामिल तालिकाओं पर सभी रिकॉर्ड पर होना चाहिए। यदि आप केवल तालिकाओं में से किसी एक पंक्ति को लॉक करना चाहते हैं, तो आप इसे अलग से कर सकते हैं: 'कुंजीटेबल से चुनें 1 ... अद्यतन के लिए'।

यह कहा गया कि, चयन और अद्यतन के बीच अद्यतन को रोकने के लिए इसकी आवश्यकता नहीं है। SELECT पर रीड लॉक पहले से ही ऐसा करता है। फॉर अपडेट का उद्देश्य अन्य लेनदेन को पंक्तियों को पढ़ने से रोकने के लिए होगा और इस प्रकार संभावित रूप से डेडलॉक पैदा कर रहा है क्योंकि अद्यतन तब तक लागू नहीं किया जा सकता जब तक कि अन्य लेन-देन इसके रीड लॉक को रिलीज़ न करे।

+2

"यह कहा गया है कि चयन और अद्यतन के बीच अद्यतन को रोकने के लिए इसकी आवश्यकता नहीं है। SELECT पर पढ़ने वाला लॉक पहले से ही यह" करता है मुझे नहीं लगता कि यह सच है। यह केवल तभी सच है जब आप चयन करते हैं ... शेयर मोड में लॉक करें –

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