मैं नौकरी कतार बनाने के लिए MySQL में पंक्ति लॉकिंग (लेनदेन) का उपयोग कर रहा हूं। इंजन का इस्तेमाल InnoDB है।MySQL पंक्ति लॉकिंग के नुकसान
एसक्यूएल क्वेरी
START TRANSACTION;
SELECT *
FROM mytable
WHERE status IS NULL
ORDER BY timestamp DESC LIMIT 1
FOR UPDATE;
UPDATE mytable SET status = 1;
COMMIT;
इस
webpage के अनुसार
,
The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for all of the worker processes, and you see a lot of processes waiting for the locks to be released with COMMIT.
प्रश्न: इसका मतलब यह है कि जब पहली क्वेरी निष्पादित किया जाता है, जो लेता है वें खत्म करने के लिए कुछ समय पहले लेनदेन करने से पहले दूसरी समान क्वेरी होती है, तो क्वेरी को निष्पादित करने से पहले इसे पूरा करने के लिए इंतजार करना होगा? यदि यह सत्य है, तो मुझे समझ में नहीं आता कि एक पंक्ति (जो मुझे लगता है) की पंक्ति लॉकिंग अगले लेनदेन क्वेरी को प्रभावित करेगी, जिसे उस लॉक पंक्ति को पढ़ने की आवश्यकता नहीं होगी?
इसके अतिरिक्त, लेनदेन के बजाय UPDATE
करके इस समस्या को हल किया जा सकता है (और अभी भी जॉब कतार के लिए प्रभाव पंक्ति लॉकिंग प्राप्त कर सकता है)?
UPDATE mytable SET status = 1
WHERE status IS NULL
ORDER BY timestamp DESC
LIMIT 1
लॉकिंग स्टोरेज इंजन पर आधारित है - आप क्या उपयोग कर रहे हैं? –
पोस्ट संपादित किया गया, इसके InnoDB – Nyxynyx
धन्यवाद (और 9 और वर्ण जाने के लिए) –