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

MySQL से कैसे बचें 'लॉक प्राप्त करने का प्रयास करते समय डेडलॉक मिला; लेनदेन को पुनः आरंभ करने का प्रयास करें'

एक आसान तरकीब जो अधिकांश गतिरोधों में मदद कर सकती है, वह है संचालन को एक विशिष्ट क्रम में क्रमबद्ध करना।

जब दो लेन-देन विपरीत क्रम में दो तालों को लॉक करने का प्रयास कर रहे हों, तो आपको गतिरोध मिलता है, अर्थात:

  • कनेक्शन 1:ताला कुंजी(1), ताला कुंजी(2);
  • कनेक्शन 2:लॉक की (2), लॉक की (1);

यदि दोनों एक ही समय में चलते हैं, तो कनेक्शन 1 कुंजी (1) को लॉक कर देगा, कनेक्शन 2 कुंजी (2) को लॉक कर देगा और प्रत्येक कनेक्शन दूसरे के लिए कुंजी -> गतिरोध जारी करने की प्रतीक्षा करेगा।

अब, यदि आपने अपने प्रश्नों को इस तरह बदल दिया है कि कनेक्शन उसी क्रम में चाबियों को लॉक कर देगा, अर्थात:

  • कनेक्शन 1:ताला कुंजी(1), ताला कुंजी(2);
  • कनेक्शन 2:कुंजी को लॉक करता है(1 ), ताला कुंजी(2 );

गतिरोध प्राप्त करना असंभव होगा।

तो मैं यही सुझाव देता हूं:

  1. सुनिश्चित करें कि आपके पास कोई अन्य क्वेरी नहीं है जो डिलीट स्टेटमेंट को छोड़कर एक समय में एक से अधिक कुंजी तक पहुंच को लॉक करती है। यदि आप करते हैं (और मुझे संदेह है कि आप ऐसा करते हैं), तो उनके WHERE in (k1,k2,..kn) को आरोही क्रम में क्रमित करें।

  2. बढ़ते क्रम में काम करने के लिए अपने डिलीट स्टेटमेंट को ठीक करें:

बदलें

DELETE FROM onlineusers 
WHERE datetime <= now() - INTERVAL 900 SECOND

करने के लिए

DELETE FROM onlineusers 
WHERE id IN (
    SELECT id FROM onlineusers
    WHERE datetime <= now() - INTERVAL 900 SECOND 
    ORDER BY id
) u;

ध्यान रखने वाली एक और बात यह है कि MySQL प्रलेखन सुझाव देता है कि गतिरोध के मामले में क्लाइंट को स्वचालित रूप से पुनः प्रयास करना चाहिए। आप इस तर्क को अपने क्लाइंट कोड में जोड़ सकते हैं। (मान लीजिए, हार मानने से पहले इस विशेष त्रुटि पर 3 पुन:प्रयास करें)।



  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 में दिनांक फ़ील्ड के साथ केवल दिन और महीने की तुलना करें

  2. ER_NOT_SUPPORTED_AUTH_MODE - MySQL सर्वर

  3. MySQL क्वेरी में IF कंडीशन के साथ गिनें

  4. LAST_DAY () उदाहरण – MySQL

  5. पायथन का उपयोग करके MySQL से कनेक्ट करना