Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पंक्तियों को अलग करने के लिए अद्यतन के लिए चयन... का उपयोग करने का न्यूनतम उदाहरण

SELECT ... FOR UPDATE पंक्तियों को अनन्य मोड में लॉक करता है, जिसका अर्थ है कि दूसरा चयन तब तक आगे नहीं बढ़ सकता जब तक कि पहला पूरा नहीं हो जाता या वापस लुढ़क नहीं जाता। ऐसा इसलिए है क्योंकि दूसरे चयन का परिणाम आपके द्वारा लॉक की गई पंक्ति की सामग्री से प्रभावित हो सकता है, इसलिए इसे जांचने के लिए पंक्ति में रीड लॉक प्राप्त करने की आवश्यकता है।

अगर आप एक UNIQUE INDEX बनाते हैं उदाहरण के लिए id . पर , आप कर सकते हैं;

select * from SolrCoresPreallocated where id=1 for update;

पहले लेन-देन में और;

select * from SolrCoresPreallocated where id=2 for update;

दूसरे में स्वतंत्र रूप से, चूंकि अद्वितीय अनुक्रमणिका दूसरे चयन को पहले वाले को रीड-लॉक किए बिना सही पंक्ति खोजने देती है।

संपादित करें:जितनी जल्दी हो सके "मुफ़्त" पंक्ति प्राप्त करने के लिए, वास्तव में दो लेन-देन करने का एकमात्र तरीका है;

  • अद्यतन के लिए प्रारंभ/चुनें/व्यस्त को अद्यतन करें/पंक्ति प्राप्त करने के लिए प्रतिबद्ध करें।
  • BEGIN/<प्रक्रिया पंक्ति>/अद्यतन मुक्त करने के लिए/पंक्ति को संसाधित करने और इसे जारी करने के लिए प्रतिबद्ध करें।

इसका मतलब यह है कि यदि कोई प्रक्रिया विफल हो जाती है और लेन-देन को वापस रोल कर देता है तो आपको क्षतिपूर्ति कार्यों की आवश्यकता हो सकती है जो पंक्ति को मुक्त करने के लिए अद्यतन करेगा, लेकिन चूंकि MySQL (या उस मामले के लिए मानक एसक्यूएल) में "अगली अनलॉक पंक्ति प्राप्त करें" की धारणा नहीं है ", आपके पास कई विकल्प नहीं हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql डंप एसक्यूएल फ़ाइल को प्रारूप में बदलने के लिए स्क्रिप्ट जिसे sqlite3 डीबी में आयात किया जा सकता है

  2. R . में विश्लेषण के लिए MySQL में बड़ा डेटाबेस सेट करें

  3. मैं MySQL में एक विदेशी कुंजी बाधा को अस्थायी रूप से कैसे अक्षम कर सकता हूं?

  4. लॉक टेबल का पता लगाना (लॉक टेबल द्वारा लॉक किया गया)

  5. Yii ढांचे में डेटाबेस कनेक्शन को कॉन्फ़िगर करना