यह गतिरोध पैदा कर रहा है क्योंकि UPDATE
query तालिका में सभी पंक्तियों को लॉक कर रहा है, और उपयोग किए गए इंडेक्स (या उसके अभाव) के आधार पर, दो अलग-अलग सत्र संभावित रूप से उन्हें थोड़ा अलग क्रम में लॉक कर देंगे। याद रखें कि UPDATE
, DELETE
, और SELECT ... FOR UPDATE
उनके सामने आने वाली सभी पंक्तियों को लॉक कर देगा, चाहे वे पंक्तियाँ सभी WHERE
. से मेल खाती हों शर्तें हैं या नहीं। इसलिए उनका उपयोग करते समय, आपको यह सुनिश्चित करने के लिए कड़ी मेहनत करनी चाहिए कि वे अनुक्रमणिका (आदर्श रूप से प्राथमिक कुंजी) का उपयोग करके और अस्पष्ट या विस्तृत-चयन स्थितियों से बचकर कम से कम पंक्तियों का सामना करें।
कार्य कतारों के लिए मेरा सुझाव बहुत अधिक सार्वभौमिक है:जितना संभव हो उतना कम लॉक करें और हमेशा एक नियतात्मक क्रम में। तो, आम तौर पर:
- गैर-लॉकिंग पठन का उपयोग करें (नियमित
SELECT
) काम की तलाश करने के लिए उस सामान की तलाश करना जो आपका कार्यकर्ता जानता है कि कैसे करना है और वर्तमान में लावारिस है (lease_owner IS NULL AND lease_expiry IS NULL
-- या समान)। - एक कार्य आइटम चुनें (या कुछ यदि आप की हिम्मत है, लेकिन एक कहीं अधिक सरल है और सामान्य रूप से पूरी तरह से स्वीकार्य प्रदर्शन की अनुमति देता है)।
- अपना कार्य आइटम अपडेट करें (इस पर दावा करने के लिए, लेकिन किसी भी मामले में इसे अपडेट करने की भी आवश्यकता है):
- लेनदेन खोलें।
- अपने चुने हुए कार्य आइटम को
SELECT ... FOR UPDATE
. के साथ लॉक करें -- अगर अब दावा नहीं किया गया है, तो निरस्त करें और दूसरा चुनें। - अपने चुने हुए कार्य आइटम को अपनी वर्कर आईडी और उस पर आपके पट्टे के लिए समाप्ति समय के साथ अपडेट करें।
- अपना लेनदेन तुरंत करें।
- अपने पट्टे पर दिए गए कार्य आइटम पर काम शुरू करें।
- किसी अन्य प्रक्रिया में, एक अन्य मतदानकर्ता छोड़े गए कार्य की तलाश करता है और उस पर दावा नहीं करता है (ऊपर उसी अद्यतन प्रक्रिया के माध्यम से)।
आप इस डिज़ाइन (प्रति सेकंड हज़ारों नौकरियां) के साथ बहुत अधिक थ्रूपुट आसानी से प्राप्त कर सकते हैं, और अनिवार्य रूप से कोई विवाद नहीं और कोई ऑर्डरिंग समस्या नहीं है। ऐसे काम को चुनने के लिए ऑप्टिमाइज़ेशन जो अन्य पोलर्स के साथ संघर्ष की संभावना कम है, सरल और प्रभावी हैं (उदाहरण के लिए जॉब आईडी या इसी तरह का मॉड्यूलस, नौकरियों की भुखमरी से बचने के लिए चुना गया)। मुख्य बात यह याद रखना है कि नौकरी के चयन पर विरोध ठीक है -- बस निरस्त करें और पुन:प्रयास करें और सब कुछ बहुत तेज़ी से आगे बढ़ता है।
कार्य कतार वस्तुओं/कार्यों के लिए सभी लॉकिंग लेखन केवल एकल पंक्तियों . पर किए जाने चाहिए और प्राथमिक कुंजी केवल . द्वारा ।