SELECT ... FOR UPDATE
पंक्तियों को अनन्य मोड में लॉक करता है, जिसका अर्थ है कि दूसरा चयन तब तक आगे नहीं बढ़ सकता जब तक कि पहला पूरा नहीं हो जाता या वापस लुढ़क नहीं जाता। ऐसा इसलिए है क्योंकि दूसरे चयन का परिणाम आपके द्वारा लॉक की गई पंक्ति की सामग्री से प्रभावित हो सकता है, इसलिए इसे जांचने के लिए पंक्ति में रीड लॉक प्राप्त करने की आवश्यकता है।
अगर आप एक UNIQUE INDEX
बनाते हैं उदाहरण के लिए id
. पर , आप कर सकते हैं;
select * from SolrCoresPreallocated where id=1 for update;
पहले लेन-देन में और;
select * from SolrCoresPreallocated where id=2 for update;
दूसरे में स्वतंत्र रूप से, चूंकि अद्वितीय अनुक्रमणिका दूसरे चयन को पहले वाले को रीड-लॉक किए बिना सही पंक्ति खोजने देती है।
संपादित करें:जितनी जल्दी हो सके "मुफ़्त" पंक्ति प्राप्त करने के लिए, वास्तव में दो लेन-देन करने का एकमात्र तरीका है;
- अद्यतन के लिए प्रारंभ/चुनें/व्यस्त को अद्यतन करें/पंक्ति प्राप्त करने के लिए प्रतिबद्ध करें।
- BEGIN/<प्रक्रिया पंक्ति>/अद्यतन मुक्त करने के लिए/पंक्ति को संसाधित करने और इसे जारी करने के लिए प्रतिबद्ध करें।
इसका मतलब यह है कि यदि कोई प्रक्रिया विफल हो जाती है और लेन-देन को वापस रोल कर देता है तो आपको क्षतिपूर्ति कार्यों की आवश्यकता हो सकती है जो पंक्ति को मुक्त करने के लिए अद्यतन करेगा, लेकिन चूंकि MySQL (या उस मामले के लिए मानक एसक्यूएल) में "अगली अनलॉक पंक्ति प्राप्त करें" की धारणा नहीं है ", आपके पास कई विकल्प नहीं हैं।