आपके परीक्षण परिदृश्य में पहला मुद्दा यह है कि तालिका में 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')