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

टीएसक्यूएल स्टेटमेंट ब्लॉक क्यों डालें जब किसी अन्य लेनदेन के लिए लेनदेन अलगाव स्तर गैर-परस्पर विरोधी फ़िल्टर के साथ क्रमबद्ध है?

आपके परीक्षण परिदृश्य में पहला मुद्दा यह है कि तालिका में firstname . पर कोई उपयोगी अनुक्रमणिका नहीं है . दूसरा यह है कि टेबल खाली है।

की-रेंज लॉकिंग से बोल में

RangeS-S लेने के लिए कोई उपयुक्त अनुक्रमणिका नहीं है सीरियल करने योग्य शब्दार्थ की गारंटी के लिए लॉक ऑन करता है SQL सर्वर को पूरी तालिका को लॉक करने की आवश्यकता होती है।

यदि आप नीचे दिए गए पहले नाम कॉलम पर तालिका में क्लस्टर इंडेक्स जोड़ने का प्रयास करते हैं और प्रयोग दोहराते हैं ...

[dbo] पर
CREATE CLUSTERED INDEX [IX_FirstName] ON [dbo].[dummy] ([firstname] ASC)

... आप पाएंगे कि आप अभी भी अवरुद्ध हैं!

इस तथ्य के बावजूद कि एक उपयुक्त सूचकांक अब मौजूद है और निष्पादन योजना से पता चलता है कि इसे क्वेरी को संतुष्ट करने के लिए खोजा गया है।

आप निम्न को चलाकर क्यों देख सकते हैं

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

SELECT *
FROM   dummy
WHERE  firstname = 'abc'

SELECT resource_type,
       resource_description, 
       request_mode
FROM   sys.dm_tran_locks
WHERE  request_session_id = @@SPID

COMMIT 

रिटर्न

+---------------+----------------------+--------------+
| resource_type | resource_description | request_mode |
+---------------+----------------------+--------------+
| DATABASE      |                      | S            |
| OBJECT        |                      | IS           |
| PAGE          | 1:198                | IS           |
| KEY           | (ffffffffffff)       | RangeS-S     |
+---------------+----------------------+--------------+

SQL सर्वर केवल आपके द्वारा अपनी क्वेरी में निर्दिष्ट सीमा पर एक रेंज लॉक नहीं निकालता है।

एक समानता के लिए एक अद्वितीय सूचकांक पर भविष्यवाणी करें यदि कोई मिलान कुंजी है तो यह किसी भी प्रकार के रेंज लॉक के बजाय केवल एक नियमित लॉक लेगा।

एक गैर अद्वितीय खोज के लिए यह सीमा के भीतर सभी मिलान कुंजियों पर ताले लेता है और साथ ही सीमा के अंत में "अगला" एक (या ffffffffffff पर) अनंत का प्रतिनिधित्व करने के लिए यदि कोई "अगली" कुंजी मौजूद नहीं है)। यहां तक ​​कि हटाए गए "भूत" रिकॉर्ड भी इस रेंज की लॉकिंग में इस्तेमाल किया जा सकता है।

जैसा कि यहां बताया गया है एक समानता के लिए एक अद्वितीय या गैर अद्वितीय सूचकांक पर विधेय

तो एक खाली टेबल के साथ SELECT अभी भी पूरे इंडेक्स को लॉक कर देता है। आपको पहले abc . के बीच एक पंक्ति भी डालनी होगी और lmn और फिर आपका इंसर्ट सफल होगा।

insert into dummy values('def', 'def')


  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 सर्वर डेटाबेस बैकअप एन्क्रिप्शन

  2. SQL सर्वर कर्सर में एकाधिक मान प्राप्त करें

  3. SQL सर्वर में FILEGROUPPROPERTY () का उपयोग कैसे करें

  4. बनाओ, तोड़ो नहीं, SQL सर्वर प्रदर्शन

  5. SQL सर्वर में Msg 8116 "तर्क डेटा प्रकार दिनांक सबस्ट्रिंग फ़ंक्शन के तर्क 1 के लिए अमान्य है" को ठीक करें