मेरे पास कई .NET प्रक्रियाएं SQL Server 2008 डीबी तालिका से संदेशों को पढ़ने और उन्हें एक समय में संसाधित करने की प्रक्रिया करती हैं। मैं एक ही पंक्ति को संसाधित करने वाली किसी भी दो प्रक्रियाओं से बचने के लिए किसी भी एक प्रक्रिया द्वारा पढ़ी जा रही पंक्ति को 'लॉक' करने के लिए एक सरल एसपी लागू करता हूं।स्पैम निष्पादित करते समय एक पंक्ति को ब्लॉक करें
BEGIN TRAN
SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
-- Already locked by another process. Skip this
RETURN 0
END
ELSE
UPDATE t SET status = 'L' WHERE id = @id
RETURN 1
END
COMMIT
हालांकि, इस त्रुटिपूर्ण है: कभी कभी एक पंक्ति हो जाता है दो बार के लॉक किए गए 'और प्रसंस्कृत। मुझे संदेह है कि एक सहमति समस्या है: एक अपडेट से पहले स्थिति पढ़ने के दो प्रक्रियाएं।
मुझे लगता है कि किसी भी तरह से एक पठन ब्लॉक को लागू करके इसे हल किया जा सकता है (यानी लेनदेन ब्लॉक पढ़ता है), लेकिन मुझे यह सुनिश्चित नहीं है कि यह कैसे करें। क्या कोई मदद कर सकता है?
SELECT @status = status FROM t (UPDLOCK) WHERE t.id = @id
अधिक जानकारी के लिए this लिंक को देखें:
अग्रिम धन्यवाद
रयान
मुझे यह जोड़ना चाहिए कि प्रक्रियाएं अलग हैं। नेट प्रक्रियाएं, बहु-थ्रेडेड एकल निष्पादन नहीं, इसलिए इसे सी # प्रोग्रामिंग स्तर पर हल नहीं किया जा सकता है। – Ryan