मैंने SQL Server 2005 से 2008 तक अपग्रेड किया है। मुझे याद है कि 2005 में, रोउलॉक बस काम नहीं करता था और मुझे किसी भी प्रकार की वास्तविक लॉकिंग प्राप्त करने के लिए पेजेलोक या एक्सलॉक का उपयोग करना पड़ा । मुझे पता है कि इसके एक पाठक पूछेंगे "तुमने क्या गलत किया?" कुछ भी तो नहीं। मैंने निश्चित रूप से साबित किया कि मैं "ROWLOCKED" पंक्ति संपादित कर सकता हूं, लेकिन अगर मैं लॉक स्तर को बढ़ा नहीं सकता। मुझे यह देखने का मौका नहीं मिला कि यह SQL 2008 में काम करता है या नहीं। मेरा पहला सवाल है कि 2008 में कोई भी इस मुद्दे पर आया है?SQL सर्वर ROWLOCK एक चयन पर मौजूद है यदि INSERT लेनदेन नहीं है
मेरा दूसरा प्रश्न निम्नानुसार है। मैं परीक्षण करना चाहता हूं कि कोई मान मौजूद है या नहीं, और यदि ऐसा है, तो संपूर्ण पंक्ति डालने के बजाय प्रासंगिक कॉलम पर अपडेट करें। इसका अर्थ यह है कि यदि पंक्ति पाई जाती है तो उसे रखरखाव प्रक्रिया के रूप में लॉक करने की आवश्यकता होती है, इस पंक्ति को मध्य-प्रक्रिया को हटा सकता है, जिससे त्रुटि उत्पन्न होती है।
सिद्धांत को स्पष्ट करने के लिए, क्या निम्न कोड काम करेगा?
BEGIN TRAN
SELECT ProfileID
FROM dbo.UseSessions
WITH (ROWLOCK)
WHERE (ProfileID = @ProfileID)
OPTION (OPTIMIZE FOR (@ProfileID UNKNOWN))
if @@ROWCOUNT = 0 begin
INSERT INTO dbo.UserSessions (ProfileID, SessionID)
VALUES (@ProfileID, @SessionID)
end else begin
UPDATE dbo.UserSessions
SET SessionID = @SessionID, Created = GETDATE()
WHERE (ProfileID = @ProfileID)
end
COMMIT TRAN
क्या कोई कारण है कि आप 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx) का उपयोग नहीं कर सकते हैं? –
धन्यवाद @ एडी। मुझे नहीं पता था कि आदेश मौजूद था। यह एक सवाल का जवाब है। – IamIC
ठीक है, यह मेरी त्रुटि थी। बेशक। – IamIC