2012-09-26 12 views
5

मैं नौकरी कतार बनाने के लिए 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 
+0

लॉकिंग स्टोरेज इंजन पर आधारित है - आप क्या उपयोग कर रहे हैं? –

+0

पोस्ट संपादित किया गया, इसके InnoDB – Nyxynyx

+0

धन्यवाद (और 9 और वर्ण जाने के लिए) –

उत्तर

1

आप पेज या पंक्ति ताले का उपयोग करता है एक भंडारण इंजन के साथ UPDATE के लिए उपयोग करते हैं, क्वेरी द्वारा जांच की पंक्तियाँ लिखने बंद कर दिया वर्तमान लेन-देन के अंत तक कर रहे हैं। LOCK IN SHARE MODE का उपयोग एक साझा लॉक सेट करता है जो अन्य लेनदेन को जांच पंक्तियों को पढ़ने की अनुमति देता है लेकिन update or delete पर नहीं। और इस क्वेरी

UPDATE mytable SET status = 1 
WHERE status IS NULL 
ORDER BY timestamp DESC 
LIMIT 1 

InnoDB SQL कथन मैं यह एक ही रूप में काम करता लगता है की प्रक्रिया के दौरान स्वचालित रूप से लॉक प्राप्त के बाद से बारे में।

संबंधित मुद्दे