संपादित करें:
मैंने अपना उत्तर जांचने के लिए गुगली की:"SQL सर्वर में डेटा कतारों को रीडपास्ट और UPDLOCK के साथ संसाधित करना"। मुझे इस समाधान के बारे में पढ़े और इसके साथ खेले हुए कई साल हो गए हैं।
मूल:
यदि आप READPAST संकेत का उपयोग करते हैं, तो बंद पंक्तियों को छोड़ दिया जाता है। आपने ROWLOCK का उपयोग किया है इसलिए आपको लॉक एस्केलेशन से बचना चाहिए। जैसा कि मुझे पता चला, आपको UPDLOCK की भी आवश्यकता है।
तो प्रक्रिया 1 20 पंक्तियों को लॉक करती है, प्रक्रिया 2 में अगले 20 में, प्रक्रिया 3 में 41 से 60 तक की पंक्तियाँ लगती हैं, आदि
अपडेट को इस तरह भी लिखा जा सकता है:
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
ताज़ा करें, अक्टूबर 2011
यदि आपको एक बार में SELECT और UPDATE की आवश्यकता है, तो इसे OUTPUT क्लॉज के साथ और अधिक सुरुचिपूर्ण ढंग से किया जा सकता है।