কেন এই আরএক্স-এক্স লকটি বর্ধিত ইভেন্টগুলিতে প্রদর্শিত হবে না?


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) মুক্তি পেয়েছি, যদিও এটি কখনও অর্জিত হয়নি released

LAST_MODE

আমি কি চেষ্টা করেছি

  • আমি বর্ধিত ইভেন্টগুলিতে সমস্ত লকের দিকে নজর রেখেছি - কোনও ফিল্টারিং নেই। কোনও আরএক্স-এক্স লক অর্জিত হয়নি।

  • আমি প্রোফাইলারও চেষ্টা করেছিলাম: একই ফলাফল (অবশ্যই এটি নামটি পেয়ে যায় ... "LAST_MODE" নয়)।

  • আমি লক এসকেলেশনগুলির জন্য এক্সই চালিয়েছি - এটি সেখানে নেই।

  • রূপান্তরগুলির জন্য বিশেষত কোনও এক্সই নেই, তবে আমি নিশ্চিত করতে পেরেছিলাম যে কমপক্ষে ইউ টু এক্স লক রূপান্তর দ্বারা ধরা পড়েছে lock_acquired

এছাড়াও দ্রষ্টব্যটি হ'ল আরআই-এন যা অর্জন হয় তবে কখনই মুক্তি পায় না। আমার বর্তমান অনুমানটি হ'ল এখানে বর্ণিত হিসাবে আরএক্স-এক্স একটি রূপান্তর লক । আমার ব্যাচে ওভারল্যাপিং কী-রেঞ্জের লক রয়েছে যা দেখে মনে হচ্ছে তাদের রূপান্তরকরণের জন্য যোগ্য হওয়া উচিত, তবে আরএক্স-এক্স লক রূপান্তর টেবিলটিতে নেই।

এই লকটি কোথা থেকে আসছে এবং এটি কেন বর্ধিত ইভেন্টগুলি দ্বারা তুলে নেওয়া হচ্ছে না?

উত্তর:


12

একক সারি সন্নিবেশ Xনতুন সারিতে একটি (একচেটিয়া) লক অর্জন করে।

SELECTএকটি সীমার ভাগ করা, কী অর্জন প্রচেষ্টা (ভাগ RangeS-S) লক।

এই অনুরোধটি lock_acquiredমোড = হিসাবে বর্ধিত ইভেন্ট দ্বারা প্রতিবেদন করা হয়েছে RS_S

এটি প্রোফাইলার ইভেন্ট ক্লাস দ্বারা Lock:Acquired13 ( LCK_M_RS_S) মোড হিসাবে রিপোর্ট করা হয়েছে ।

অনুরোধ মোড বিদ্যমান সঙ্গে মিলিত হয় একচেটিয়া মধ্যে লক মোড Lock::CalculateGrantModeমধ্যে sqlmin.dll। কোনও পরিসীমা-ভাগ করে নেওয়া, কী একচেটিয়া ( RangeS-X) এর সমন্বিত মোড নেই তাই গণনার ফলাফলটি পরিসীমা-একচেটিয়া, কী একচেটিয়া ( RangeX-X), যা মোড 15 হিসাবে ঘটে।

উপরের অনুদান মোড গণনাটি বর্ধিত ইভেন্ট দ্বারা উত্পন্ন করার ঠিক আগে সঞ্চালিত হয় lck_ProduceExtendedEvent<XeSqlPkg::lock_acquired>। তবুও, প্রোফাইলার এবং বর্ধিত ইভেন্ট উভয়ই অনুরোধ RangeS-S মোডে লগ করে , ফলস্বরূপ লক মোডটি নয় RangeX-X। এটি সীমিত ডকুমেন্টেশনের বিরোধী , যা বলে:

মোড | int | লকটি অর্জিত হওয়ার পরে ফলাফল মোড।

মোড বর্ধিত ঘটনা কলাম সব সময়ে কোন ডকুমেন্টেশন আছে, এবং মেটা ডেটা বিবরণ ফাঁকা। মাইক্রোসফ্ট নিজেও আচরণ সম্পর্কে নিশ্চিত ছিল না।

আমি প্রায়শই ভেবেছিলাম যে লক ইভেন্টগুলি অনুরোধকৃত এবং ফলস্বরূপ উভয় মোডের প্রতিবেদন করা থাকলে এটি আরও কার্যকর হবে but বর্তমান ব্যবস্থা লক অধিগ্রহণ এবং প্রকাশের ট্র্যাক এবং মিল খুঁজে পাওয়া বেশ অসম্ভব করে তোলে।

সেখানে পারে কেশ এই ভাবে রিপোর্ট করার জন্য একটি ভাল কারণ হবে। যদি এটি আপনার প্রয়োজনগুলি পূরণ করে না, আপনি মাইক্রোসফ্টের সাথে একটি সমর্থন কেস খুলতে পারেন, বা একটি অ্যাজুরি প্রতিক্রিয়া আইটেম তৈরি করতে পারেন।


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 ║
╚═════════╩═══════════╝

ডিএমভি (ব্যবহার করে sqlmin!CMapValuesTable) এর মাধ্যমে অ্যাক্সেস করা মেমরি কাঠামো ঠিকানায় শুরু করে সংরক্ষণ করা হয় sqlmin!XeSqlPkg::g_lock_mode। কাঠামোর প্রতিটি 16-বাইট এন্ট্রিতে স্ট্রিমিং টিভিএফ দ্বারা map_keyস্ট্রিংটিতে ফিরে আসা একটি পয়েন্টার থাকে map_value

উপরের সারণীতে প্রদর্শিত স্ট্রিংগুলি ঠিক সেইভাবে সংরক্ষণ করা হয়েছে (যদিও এটি ক্রমে নেই)। এটি ত্রুটি বলে মনে হচ্ছে 21 এন্ট্রিতে map_valueপ্রত্যাশিত "আরএক্স_এক্স" এর পরিবর্তে "LAST_MODE" রয়েছে। এরিক ডার্লিং আজুর প্রতিক্রিয়াতে সমস্যাটি রিপোর্ট করেছেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.