6

मैंने 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 
+5

क्या कोई कारण है कि आप 'MERGE' (http://technet.microsoft.com/en-us/library/bb510625.aspx) का उपयोग नहीं कर सकते हैं? –

+0

धन्यवाद @ एडी। मुझे नहीं पता था कि आदेश मौजूद था। यह एक सवाल का जवाब है। – IamIC

+0

ठीक है, यह मेरी त्रुटि थी। बेशक। – IamIC

उत्तर

13

एक व्याख्या ...

  • चप्पू-आंकड़ा/PAGELOCK के विवरण का स्तर है
  • XLOCK विधा है

पठन स्तर और अलगाव के स्तर पर और मोड ओर्थोगोनल हैं।

  • पठन स्तर = क्या लॉक किया गया है = पंक्ति, पेज, टेबल (PAGLOCK, ROWLOCK, TABLOCK)

  • अलगाव स्तर = ताला अवधि, संगामिति (HOLDLOCK, READCOMMITTED, REPEATABLEREAD, SERIALIZABLE)

  • मोड = बंटवारे/विशिष्टता (UPDLOCK, XLOCK)

  • "संयुक्त" उदाहरण NOLOCK, TABLOCKX

एक्सएलके ने विशेष रूप से पंक्ति को लॉक कर दिया होगा जैसा आप चाहते हैं। ROWLOCK/PAGELOCK नहीं होगा।

+0

धन्यवाद @ जीबीएन। तो "\t (एक्सलॉक, रोलोक) के साथ" चाल चलती है :) – IamIC

+0

विचित्र रूप से (PAGELOCK) ने पंक्ति को लॉक कर दिया। आप जो कह रहे हैं, उससे मुझे नहीं पता कि यह क्यों होगा। – IamIC

+0

@IanC नहीं यह निश्चित रूप से चाल नहीं करेगा - ऊपर मेरा जवाब पढ़ें :) –

संबंधित मुद्दे