Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

UPDLOCK, होल्डलॉक के बारे में उलझन में

UPDLOCK ब्लॉक क्यों चयन करेगा? लॉक संगतता मैट्रिक्स स्पष्ट रूप से N . दिखाता है S/U और U/S विवाद के लिए, जैसा कि कोई विरोध नहीं . में है .

होल्डलॉक संकेत के लिए प्रलेखन कहता है:

<ब्लॉकक्वॉट>

होल्डलॉक:सीरियल के बराबर है। अधिक जानकारी के लिए, इस विषय में बाद में SERIALIZABLE देखें।

...

SERIALIZABLE:... स्कैन उसी शब्दार्थ के साथ किया जाता है जो SERIALIZABLE आइसोलेशन स्तर पर चल रहे लेनदेन के रूप में होता है...

और लेन-देन अलगाव स्तर विषय बताता है कि SERIALIZABLE का क्या अर्थ है:

<ब्लॉकक्वॉट>

कोई अन्य लेन-देन उस डेटा को संशोधित नहीं कर सकता है जिसे वर्तमान लेनदेन द्वारा पढ़ा गया है जब तक कि वर्तमान लेनदेन पूरा नहीं हो जाता।

अन्य लेन-देन कुंजी मानों के साथ नई पंक्तियाँ सम्मिलित नहीं कर सकते हैं जो वर्तमान लेन-देन में किसी भी कथन द्वारा पढ़ी गई कुंजियों की श्रेणी में आती हैं जब तक कि वर्तमान लेनदेन पूरा नहीं हो जाता।

इसलिए आप जो व्यवहार देखते हैं वह उत्पाद दस्तावेज़ीकरण द्वारा पूरी तरह से समझाया गया है:

  • UPDLOCK समवर्ती SELECT और INSERT को ब्लॉक नहीं करता है, लेकिन T1 द्वारा चुनी गई पंक्तियों के किसी भी UPDATE या DELETE को ब्लॉक करता है
  • HOLDLOCK का अर्थ है SERALIZABLE और इसलिए SELECTS को अनुमति देता है, लेकिन T1, साथ ही द्वारा चुनी गई पंक्तियों के UPDATE और DELETES को ब्लॉक कर देता है T1 द्वारा चयनित श्रेणी में किसी भी INSERT के रूप में (जो कि संपूर्ण तालिका है, इसलिए कोई भी डालें)।
  • (UPDLOCK, HOLDLOCK):आपका प्रयोग यह नहीं दिखाता कि ऊपर दिए गए मामले के अलावा और क्या ब्लॉक होगा, अर्थात् T2 में UPDLOCK के साथ एक और लेनदेन :
    SELECT * FROM dbo.Test WITH (UPDLOCK) WHERE ...
  • TABLOCKX को स्पष्टीकरण की कोई आवश्यकता नहीं है

असली सवाल यह है कि आप क्या हासिल करने की कोशिश कर रहे हैं ? लॉक संकेतों के साथ खेलना पूरी तरह से पूर्ण 110% लॉकिंग सेमेन्टिक्स की समझ परेशानी के लिए भीख मांग रहा है...

ओपी संपादन के बाद:

<ब्लॉकक्वॉट>

मैं एक तालिका से पंक्तियों का चयन करना चाहता हूं और जब मैं इसे संसाधित कर रहा हूं तो उस तालिका में डेटा को संशोधित होने से रोकना चाहता हूं।

आपको उच्च लेनदेन अलगाव स्तरों में से एक का उपयोग करना चाहिए। दोहराने योग्य पढ़ें आपके द्वारा पढ़े गए डेटा को संशोधित होने से रोकेगा। SERIALIZABLE आपके द्वारा पढ़े गए डेटा को संशोधित होने से रोकेगा और डालने से नया डेटा। क्वेरी संकेतों का उपयोग करने के विपरीत लेनदेन अलगाव स्तरों का उपयोग करना सही तरीका है। Kendra Little में एक अच्छा पोस्टर है जो अलगाव के स्तर को समझाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:केवल NULL मान वाले कॉलम चुनें

  2. SQL सर्वर प्रबंधन स्टूडियो और Transact SQL में GO का क्या उपयोग है?

  3. SQL सर्वर रनिंग क्वेरी मॉनिटरिंग

  4. SQL सर्वर TRIM, LTRIM, और RTRIM फ़ंक्शन

  5. SQL सर्वर में पिछले महीने के रिकॉर्ड प्राप्त करें