यह देखना उपयोगी हो सकता है कि यह क्वेरी वास्तव में MySQL द्वारा कैसे निष्पादित की जाती है:
select * from tbl_codes where available = 1 order by rand() limit 1 for update
यह WHERE
. से मेल खाने वाली सभी पंक्तियों को पढ़ेगा और क्रमबद्ध करेगा स्थिति, rand()
. का उपयोग करके एक यादृच्छिक संख्या उत्पन्न करें प्रत्येक पंक्ति के लिए एक वर्चुअल कॉलम में, उस वर्चुअल कॉलम के आधार पर सभी पंक्तियों (एक अस्थायी तालिका में) को सॉर्ट करें, और फिर क्लाइंट को सॉर्ट किए गए सेट से LIMIT
तक पंक्तियों को वापस कर दें। पहुंच गया है (इस मामले में सिर्फ एक)। FOR UPDATE
क्रियान्वित होने के दौरान पूरे स्टेटमेंट द्वारा किए गए लॉकिंग को प्रभावित करता है, और इस तरह क्लॉज को लागू किया जाता है क्योंकि पंक्तियों को InnoDB के भीतर पढ़ा जाता है। , नहीं जैसे ही वे क्लाइंट को वापस कर दिए जाते हैं।
उपर्युक्त (यह भयानक है) के स्पष्ट प्रदर्शन प्रभावों को छोड़कर, आपको इससे उचित लॉकिंग व्यवहार कभी नहीं मिलेगा।
संक्षिप्त उत्तर:
RAND()
का उपयोग करके अपनी इच्छित पंक्ति का चयन करें या कोई अन्य रणनीति जो आपको पसंद हो,PRIMARY KEY
. खोजने के लिए उस पंक्ति का मूल्य। उदा.:SELECT id FROM tbl_codes WHERE available = 1 ORDER BY rand() LIMIT 1
- उसकी
PRIMARY KEY
का उपयोग करके अपनी इच्छित पंक्ति को लॉक करें केवल। उदा.:SELECT * FROM tbl_codes WHERE id = N
उम्मीद है कि यह मदद करता है।