मूल MySQL लॉकिंग यह कार्यक्षमता प्रदान नहीं करता है। आप अपने "ताले" करने के लिए एक कॉलम का उपयोग कर सकते हैं।
यह मानते हुए कि प्रत्येक थ्रेड की एक विशिष्ट आईडी है, आप thread_owner
. नाम का एक कॉलम बना सकते हैं , डिफ़ॉल्ट 0 के साथ।
एक धागा इस तरह एक पंक्ति को पकड़ लेगा:
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1
फिर इस तरह की पंक्ति का चयन करें (यदि संसाधित होने के लिए कोई पंक्तियाँ नहीं थीं, तो यह कोई भी नहीं लौटा सकती है):
SELECT *
FROM mytable
WHERE thread_owner = :my_threadID
फिर इसे संसाधित करें, और अंत में इसे हटा दें।
यह समाधान MyISAM और InnoDB दोनों पर काम करेगा।
हालांकि, InnoDB के लिए, यह धीमा हो सकता है क्योंकि प्रत्येक अद्यतन विवरण उन सभी पंक्तियों को लॉक करने का प्रयास कर रहा है जहां thread_owner =0 है, और जब तक आप सुनिश्चित नहीं हैं कि आप हर बार एक ही क्रम में सभी पंक्तियों को लॉक कर रहे हैं, यह एक डेडलॉक भी पैदा कर सकता है। इसलिए, आप अपने अद्यतन विवरण में पूरी तालिका को स्पष्ट रूप से लॉक करने का प्रयास कर सकते हैं:
LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;
इस तरह, MyISAM और InnoDB दोनों एक ही तरह से काम करेंगे।