पहला: इसे लागू करने के लिए MySQL सॉफ्टवेयर के सबसे खराब संभावित टुकड़ों में से एक है, खासकर अगर यह बहुत गतिशील है। इसका कारण यह है कि MEMORY और MyISAM जैसे इंजनों में केवल फुल-टेबल लॉक होते हैं, जबकि अधिक उपयुक्त इंजन जैसे InnoDB में उच्च लिखने का दंड (ACID गुण प्रदान करने के लिए) होता है और वे उन रिकॉर्ड तक पहुँचने के लिए अनुकूलित होते हैं, जो स्थानिक और अस्थायी रूप से पास होते हैं (जो मेमोरी पर सेट होते हैं )। MySQL के लिए एक अच्छा बदलाव अधिसूचना प्रणाली भी नहीं है- इसे मतदान के रूप में लागू किया जाना है। कर रहे हैं और अधिक है कि काम के लिए अनुकूलित सॉफ्टवेयर के टुकड़े के दर्जनों ।
यह कहते हुए कि, मैंने इस तरह की पहुंच को सफलतापूर्वक लागू किया है यदि प्रदर्शन / दक्षता की आवश्यकताएं बहुत अधिक नहीं हैं। बहुत से लोग केवल व्यावसायिक तर्क के एक छोटे से हिस्से के लिए प्रौद्योगिकी का एक पूरा अलग टुकड़ा शुरू करने और बनाए रखने का जोखिम नहीं उठा सकते हैं।
SELECT FOR UPDATE
वह है जो आप देख रहे हैं- क्रमांकन पढ़ें। हालांकि एक UPDATE / DELETE हमेशा रनिंग MYSQL लेनदेन के दौरान पंक्ति को लॉक करेगा, आप प्रक्रिया को चालू करते समय एक बड़े लेनदेन से बचना चाह सकते हैं, इसलिए:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL पंक्तियों का चयन करते समय एक को छोड़कर सभी समवर्ती चयनों को लॉक करने का ध्यान रखेगा। चूंकि यह एक ही समय में बहुत सारे लॉक किए गए कनेक्शनों को जन्म दे सकता है, इसलिए शुरुआती लेनदेन को जितना संभव हो उतना छोटा रखें और एक समय में अधिक से अधिक 1 पंक्ति को संसाधित करने का प्रयास करें।