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

mysql - चुनिंदा क्वेरी के लिए पंक्तियों को लॉक करना?

मूल 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 दोनों एक ही तरह से काम करेंगे।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IntegrityError:(1062, कुंजी के लिए डुप्लिकेट प्रविष्टि)

  2. डुप्लिकेट रिकॉर्ड लौटाएं

  3. मैक ओएसएक्स पर एक साधारण MySQL सी एप्लिकेशन संकलित करते समय मुझे अपरिभाषित प्रतीक क्यों मिलते रहते हैं?

  4. MySQL तालिका संरचना, क्या मुझे प्राथमिक कुंजी की आवश्यकता है?

  5. एक जेसन स्ट्रिंग को एन्क्रिप्ट/डिक्रिप्ट करने का सबसे अच्छा तरीका क्या है?