विस्तारित घटनाओं में यह आरएक्स-एक्स लॉक क्यों नहीं दिखाई देता है?


13

समस्या

मेरे पास प्रश्नों की एक जोड़ी है, जो अनुक्रमिक अलगाव के तहत, आरएक्स-एक्स लॉक का कारण बनती हैं। हालाँकि, जब मैं लॉक अधिग्रहण देखने के लिए एक्सटेंडेड इवेंट्स का उपयोग करता हूं, तो आरएक्स-एक्स लॉक अधिग्रहण कभी नहीं दिखाई देता है, यह केवल जारी किया जाता है। यह कहां से आता है?

रेप्रो

यहाँ मेरी तालिका है:

CREATE TABLE dbo.LockTest (
ID int identity,
Junk char(4)
)

CREATE CLUSTERED INDEX CX_LockTest --not unique!
ON dbo.LockTest(ID)

--preload some rows
INSERT dbo.LockTest
VALUES ('data'),('data'),('data')

यहाँ मेरी समस्या बैच है:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

INSERT dbo.LockTest
VALUES ('bleh')

SELECT *
FROM dbo.LockTest
WHERE ID = SCOPE_IDENTITY()

--ROLLBACK

मैं इस सत्र द्वारा आयोजित ताले की जांच करता हूं, और आरएक्स-एक्स देखें:

SELECT resource_type, request_mode, request_status, resource_description
FROM sys.dm_tran_locks
WHERE request_session_id = 72 --change SPID!

dm_tran_locks

लेकिन मेरे पास एक विस्तारित ईवेंट भी है lock_acquiredऔर lock_released। मैं इसे उपयुक्त संबद्ध_बॉज़_ड पर फ़िल्टर करता हूं ... कोई आरएक्स-एक्स नहीं है।

विस्तारित इवेंट आउटपुट

रोलबैक निष्पादित करने के बाद, मुझे आरएक्स-एक्स (LAST_MODE) जारी दिखाई देता है, भले ही इसे कभी अधिग्रहित नहीं किया गया था।

LAST_MODE

मैंने क्या कोशिश की है

  • मैंने विस्तारित घटनाओं में सभी तालों को देखा - कोई फ़िल्टरिंग नहीं। कोई आरएक्स-एक्स ताले का अधिग्रहण नहीं किया।

  • मैंने Profiler की भी कोशिश की: एक ही परिणाम (निश्चित रूप से इसे नाम सही मिलता है ... नहीं "LAST_MODE")।

  • मैंने XE को लॉक एस्केलेशन के लिए चलाया - यह वहां नहीं है।

  • रूपांतरणों के लिए विशेष रूप से कोई XE नहीं है, लेकिन मैं इस बात की पुष्टि करने में सक्षम था कि कम से कम यू से एक्स लॉक रूपांतरण द्वारा कब्जा कर लिया गया है lock_acquired

नोट का भी आरआई-एन है जो अधिग्रहीत हो जाता है लेकिन कभी जारी नहीं किया जाता है। मेरी वर्तमान परिकल्पना यह है कि आरएक्स-एक्स एक रूपांतरण लॉक है, जैसा कि यहां वर्णित है । मेरे बैच में ओवरलैपिंग की-रेंज लॉक हैं जो यह देखते हैं कि उन्हें रूपांतरण के योग्य होना चाहिए, लेकिन आरएक्स-एक्स लॉक रूपांतरण तालिका में नहीं है।

यह ताला कहाँ से आ रहा है, और इसे विस्तारित घटनाओं द्वारा क्यों नहीं उठाया गया है?

जवाबों:


12

एकल पंक्ति सम्मिलित Xनई पंक्ति पर एक (अनन्य) लॉक प्राप्त करता है ।

SELECTश्रेणी-साझा, कुंजी साझा ( RangeS-S) लॉक प्राप्त करने का प्रयास ।

यह अनुरोध lock_acquiredमोड के रूप में विस्तारित ईवेंट द्वारा सूचित किया गया है RS_S

यह Profiler इवेंट क्लास द्वारा Lock:Acquiredमोड 13 ( LCK_M_RS_S) के रूप में बताया गया है ।

अनुरोधित मोड मौजूदा अनन्य लॉक मोड के साथ संयुक्त Lock::CalculateGrantModeहै sqlmin.dll। श्रेणी-साझा, कुंजी अनन्य ( RangeS-X) का कोई संयुक्त मोड नहीं है, इसलिए गणना का परिणाम रेंज-अनन्य, कुंजी अनन्य ( RangeX-X) है, जो मोड 15 होता है।

ऊपर दिए गए अनुदान मोड की गणना विस्तारित घटना के उत्पन्न होने से ठीक पहले की जाती है lck_ProduceExtendedEvent<XeSqlPkg::lock_acquired>। फिर भी, Profiler और विस्तारित ईवेंट दोनों अनुरोधित RangeS-S मोड को लॉग इन करते हैं, न कि परिणामस्वरूप लॉक मोड RangeX-X। यह सीमित प्रलेखन के लिए काउंटर है , जो कहता है:

मोड | int | लॉक प्राप्त करने के बाद परिणाम मोड।

मोड विस्तारित घटना के स्तंभ सब पर कोई प्रलेखन है, और मेटा डेटा में वर्णन खाली है। शायद Microsoft स्वयं भी व्यवहार के बारे में सुनिश्चित नहीं थे।

मैंने अक्सर सोचा है कि यह अधिक उपयोगी होगा यदि लॉक घटनाओं ने अनुरोधित और परिणामी दोनों मोडों की सूचना दी , लेकिन हमारे पास ऐसा नहीं है। वर्तमान व्यवस्था लॉक अधिग्रहण और रिलीज को ट्रैक और मैच करने के लिए बहुत असंभव बना देती है।

वहाँ हो सकता है ताले इस तरह की रिपोर्टिंग के लिए खास कारण हो। यदि यह आपकी आवश्यकताओं को पूरा नहीं करता है, तो आप Microsoft के साथ एक समर्थन मामला खोल सकते हैं, या एक एज़्योर फीडबैक आइटम बना सकते हैं।


LAST_MODE

रहस्यमय LAST_MODEकुछ है एरिक डार्लिंग ने पहले टिप्पणी की है । यह map_keyउजागर किए गए लॉक मोड की सूची में सबसे अधिक मूल्य है sys.dm_xe_map_values:

SELECT
    DXMV.map_key,
    DXMV.map_value
FROM sys.dm_xe_map_values AS DXMV
WHERE 
    DXMV.[name] = N'lock_mode'
ORDER BY
    DXMV.map_key;
╔═════════╦═══════════╗
║ map_key ║ map_value ║
╠═════════╬═══════════╣
║       0 ║ NL        ║
║       1 ║ SCH_S     ║
║       2 ║ SCH_M     ║
║       3 ║ S         ║
║       4 ║ U         ║
║       5 ║ X         ║
║       6 ║ IS        ║
║       7 ║ IU        ║
║       8 ║ IX        ║
║       9 ║ SIU       ║
║      10 ║ SIX       ║
║      11 ║ UIX       ║
║      12 ║ BU        ║
║      13 ║ RS_S      ║
║      14 ║ RS_U      ║
║      15 ║ RI_NL     ║
║      16 ║ RI_S      ║
║      17 ║ RI_U      ║
║      18 ║ RI_X      ║
║      19 ║ RX_S      ║
║      20 ║ RX_U      ║
║      21 ║ LAST_MODE ║
╚═════════╩═══════════╝

DMV के माध्यम से एक्सेस की गई मेमोरी संरचना (उपयोग करके sqlmin!CMapValuesTable) पते पर शुरू होती है sqlmin!XeSqlPkg::g_lock_mode। संरचना में प्रत्येक 16-बाइट प्रविष्टि में map_keyऔर map_valueस्ट्रीमिंग TVF द्वारा दिए गए स्ट्रिंग के लिए एक सूचक शामिल है ।

स्ट्रिंग्स को ठीक उसी तरह संग्रहीत किया जाता है जैसा ऊपर दी गई तालिका में दिखाया गया है (हालांकि उस क्रम में नहीं)। यह एक त्रुटि प्रतीत होती है कि प्रविष्टि 21 में map_valueअपेक्षित "RX_X" के बजाय "LAST_MODE" है। एरिक डार्लिंग ने एज़्योर फीडबैक पर इस मुद्दे की सूचना दी है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.