एक आसान तरकीब जो अधिकांश गतिरोधों में मदद कर सकती है, वह है संचालन को एक विशिष्ट क्रम में क्रमबद्ध करना।
जब दो लेन-देन विपरीत क्रम में दो तालों को लॉक करने का प्रयास कर रहे हों, तो आपको गतिरोध मिलता है, अर्थात:
- कनेक्शन 1:ताला कुंजी(1), ताला कुंजी(2);
- कनेक्शन 2:लॉक की (2), लॉक की (1);
यदि दोनों एक ही समय में चलते हैं, तो कनेक्शन 1 कुंजी (1) को लॉक कर देगा, कनेक्शन 2 कुंजी (2) को लॉक कर देगा और प्रत्येक कनेक्शन दूसरे के लिए कुंजी -> गतिरोध जारी करने की प्रतीक्षा करेगा।
अब, यदि आपने अपने प्रश्नों को इस तरह बदल दिया है कि कनेक्शन उसी क्रम में चाबियों को लॉक कर देगा, अर्थात:
- कनेक्शन 1:ताला कुंजी(1), ताला कुंजी(2);
- कनेक्शन 2:कुंजी को लॉक करता है(1 ), ताला कुंजी(2 );
गतिरोध प्राप्त करना असंभव होगा।
तो मैं यही सुझाव देता हूं:
-
सुनिश्चित करें कि आपके पास कोई अन्य क्वेरी नहीं है जो डिलीट स्टेटमेंट को छोड़कर एक समय में एक से अधिक कुंजी तक पहुंच को लॉक करती है। यदि आप करते हैं (और मुझे संदेह है कि आप ऐसा करते हैं), तो उनके WHERE in (k1,k2,..kn) को आरोही क्रम में क्रमित करें।
-
बढ़ते क्रम में काम करने के लिए अपने डिलीट स्टेटमेंट को ठीक करें:
बदलें
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 पुन:प्रयास करें)।