ध्वज के साथ आपका समाधान संभव लगता है और मुझे लगता है कि केवल एक चीज की जरूरत है कि ताला समाप्त हो जाए। मूल रूप से जिस तरह से मैं लॉक को आर्किटेक्ट करूंगा, वह यह है कि जब लॉक लिया गया था तो मैं टाइमस्टैम्प लिखूंगा और इसे बनाऊंगा ताकि प्रक्रिया को अपडेट करना पड़े। लॉक हर बार (यानी हर 30 सेकंड में) जबकि यह अभी भी रिकॉर्ड पर काम कर रहा है। यदि प्रक्रिया समाप्त हो जाती है या अन्यथा कार्य पूरा करने में विफल रहता है तो लॉक समाप्त हो जाएगा और अन्य प्रक्रियाएं अनलॉक कर सकती हैं यह समयबाह्य अवधि के दोगुने से अधिक होने पर समाप्त हो जाता है।
जब कोई प्रक्रिया किसी रिकॉर्ड पर काम करना समाप्त कर देती है तो वह लॉक फ़्लैग को साफ़ कर देगी और रिकॉर्ड को संसाधित (फिर से एक और फ़्लैग) के रूप में चिह्नित कर देगी।
आप शायद दो फ़ील्ड रखना चाहेंगे:एक जो टाइमस्टैम्प लॉक ध्वज को संग्रहीत करेगा और दूसरा जो इंगित करेगा कि कौन सी प्रक्रिया लॉक का मालिक है (यदि आप इसकी परवाह करते हैं)। मैं मान रहा हूं कि किसी प्रकार की कुंजी है जिसका उपयोग तालिका में रिकॉर्ड्स को ऑर्डर करने के लिए किया जा सकता है जैसे कि "अगली कार्रवाई" की अवधारणा सार्थक है।
संसाधित करने के लिए अगला रिकॉर्ड प्राप्त करने के लिए आप इस तरह की क्वेरी का उपयोग कर सकते हैं:
-- find the next available process and "lock" it by updating it's flag
UPDATE actions_tabe
SET LockFlag = @timestamp,
Process = @processname
WHERE Id IN (SELECT Id
FROM actions_table
WHERE LockFlag IS null
AND IsComplete = '0'
AND ScheduledTime < now()
ORDER BY Scheduledtime ASC, Id ASC
LIMIT 1);
-- return the Id and Action of the record that was just marked above
SELECT Id, Action
FROM actions_table
WHERE Process = @processname
नमूना पहेली यहाँ:http://sqlfiddle.com/#!11/9c120/26 /1