मैं प्रत्येक पंक्तिबद्ध वस्तु के लिए विशिष्ट रूप से वृद्धिशील आईडी प्रदान करने के लिए प्राथमिक कुंजी के रूप में एक पहचान फ़ील्ड का उपयोग करता हूं, और उस पर क्लस्टर इंडेक्स चिपकाता हूं। यह उस क्रम का प्रतिनिधित्व करेगा जिसमें आइटम कतारबद्ध थे।
आइटम को संसाधित करते समय क्यू तालिका में रखने के लिए, आपको किसी विशेष आइटम की वर्तमान स्थिति को इंगित करने के लिए "स्थिति" फ़ील्ड की आवश्यकता होगी (उदा. 0=प्रतीक्षा, 1=संसाधित किया जा रहा है, 2=संसाधित)। किसी आइटम को दो बार संसाधित होने से रोकने के लिए इसकी आवश्यकता होती है।
कतार में आइटम संसाधित करते समय, आपको तालिका में अगला आइटम ढूंढना होगा जो वर्तमान में संसाधित नहीं हो रहा है। इसे इस तरह से करने की आवश्यकता होगी ताकि एक ही आइटम को एक ही समय में संसाधित करने के लिए कई प्रक्रियाओं को रोकने के लिए जैसा कि नीचे दिखाया गया है। तालिका संकेत पर ध्यान दें UPDLOCK और READPAST जिन्हें आपको कतारों को लागू करते समय अवगत होना चाहिए।
जैसे एक स्पोक के भीतर, कुछ इस तरह:
DECLARE @NextID INTEGER
BEGIN TRANSACTION
-- Find the next queued item that is waiting to be processed
SELECT TOP 1 @NextID = ID
FROM MyQueueTable WITH (UPDLOCK, READPAST)
WHERE StateField = 0
ORDER BY ID ASC
-- if we've found one, mark it as being processed
IF @NextId IS NOT NULL
UPDATE MyQueueTable SET Status = 1 WHERE ID = @NextId
COMMIT TRANSACTION
-- If we've got an item from the queue, return to whatever is going to process it
IF @NextId IS NOT NULL
SELECT * FROM MyQueueTable WHERE ID = @NextID
यदि किसी आइटम को संसाधित करना विफल हो जाता है, तो क्या आप इसे बाद में पुन:प्रयास करने में सक्षम होना चाहते हैं? यदि ऐसा है, तो आपको या तो स्थिति को वापस 0 या कुछ और पर रीसेट करना होगा। इसके लिए अधिक विचार की आवश्यकता होगी।
वैकल्पिक रूप से, डेटाबेस तालिका को कतार के रूप में उपयोग न करें, लेकिन MSMQ जैसा कुछ - मैंने सोचा कि मैं इसे मिश्रण में फेंक दूंगा!