কোন টেবিলে কোন তালা রাখা আছে তা কীভাবে পরীক্ষা করবেন


158

কোয়েরি ব্যাচের বিপরীতে কোন সারিতে কোন ডাটাবেস লক প্রয়োগ করা হয় তা আমরা কীভাবে পরীক্ষা করতে পারি?

এমন কোনও সরঞ্জাম যা রিয়েল টাইমে টেবিল সারির স্তরটি লক করে?

ডিবি: এসকিউএল সার্ভার 2005

উত্তর:


118

অন্যান্য প্রতিক্রিয়াগুলিতে যুক্ত sp_lockকরতে , সমস্ত চলমান প্রক্রিয়াগুলিতে সম্পূর্ণ লক তথ্য ডাম্প করতেও ব্যবহার করা যেতে পারে। আউটপুটটি অপ্রতিরোধ্য হতে পারে, তবে আপনি ঠিক কীটি তালাবদ্ধ তা জানতে চান, এটি চালানো একটি মূল্যবান। sp_who2লকিং সমস্যাগুলিতে দ্রুত শূন্য করতে আমি এটি পাশাপাশি ব্যবহার করি ।

sp_lockপ্রশ্নে থাকা এসকিউএল সার্ভারের সংস্করণের উপর নির্ভর করে অনলাইনে উপলব্ধ "বন্ধুত্বপূর্ণ" পদ্ধতির একাধিক ভিন্ন সংস্করণ রয়েছে ।

আপনার ক্ষেত্রে, এসকিউএল সার্ভার ২০০ for-এর sp_lockজন্য এখনও উপলব্ধ, তবে অবমানিত হয়েছে, সুতরাং এখন sys.dm_tran_locksএই ধরণের জিনিসটির জন্য ভিউটি ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। আপনি কীভাবে "নিজের নিজের রোল করবেন" স্প_লোক ফাংশনটির উদাহরণ এখানে পাবেন


116

এটি আপনাকে কোনটি সারি লক করা হয়েছে তা হুবহু দেখাচ্ছে না, তবে এটি আপনার পক্ষে সহায়ক হতে পারে।

এটি চালিয়ে আপনি কোন বিবৃতি অবরুদ্ধ তা পরীক্ষা করতে পারেন:

select cmd,* from sys.sysprocesses
where blocked > 0

এটি প্রতিটি ব্লকে কী অপেক্ষা করছে তাও আপনাকে জানাবে will সুতরাং আপনি যে কোনও বিবৃতিতে প্রথম ব্লকটি সৃষ্টি করেছে যা অন্য ব্লকগুলির কারণ হয়ে উঠেছে তা দেখতে সর্বত্র এটি ট্রেস করতে পারেন।

@ মাইকব্ল্যান্ডফোর্ডের মন্তব্য যুক্ত করতে সম্পাদনা করুন :

অবরুদ্ধ কলামটি ব্লকিং প্রক্রিয়ার স্পাইডকে নির্দেশ করে। এটি ঠিক করতে আপনি কিল-স্পিড run চালাতে পারেন।


7
অবরুদ্ধ কলামটি ব্লকিং প্রক্রিয়ার স্পাইডকে নির্দেশ করে। এটি ঠিক করতে আপনি কিল-স্পিড run চালাতে পারেন।
মাইক Blandford

52

কোয়েরি অনুসরণ করে আপনি আপনার টেবিলের বর্তমান লকগুলি সন্ধান করতে পারেন ।

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

Sys.dm_tran_locks দেখুন

যদি একই অনুরোধ_লোনার_প্রকারের একাধিক দৃষ্টান্ত উপস্থিত থাকে, তবে প্রতিটি দৃষ্টান্ত আলাদা করতে অনুরোধ_মালার_আইডি কলামটি ব্যবহৃত হয়। বিতরণ লেনদেনের জন্য, অনুরোধ_লোনার_প্রকার এবং অনুরোধ_লোনার_গুইড কলামগুলি বিভিন্ন সত্তার তথ্য প্রদর্শন করবে।

উদাহরণস্বরূপ, সেশন এস 1 টেবিল 1 এ একটি ভাগ করা লকটির মালিক; এবং লেনদেন টি 1, যা সেশন এস 1 এর অধীনে চলছে, টেবিল 1 এ একটি ভাগ করা লকও রয়েছে। এই ক্ষেত্রে, resource_description কলাম যে ফিরিয়ে দেওয়া হয় sys.dm_tran_locks একই রিসোর্স দুই স্থানেই প্রদর্শন করা হবে। Request_owner_type কলামটি একটি অধিবেশন হিসাবে উদাহরণস্বরূপ এবং একটি লেনদেন হিসাবে অন্যান্য দেখাবে। এছাড়াও, উত্স_সামগ্রী_আইডি কলামের বিভিন্ন মান থাকবে।


36

লক থাকা আইটেমটির অবজেক্ট_আইডি বা পার্টিশন_আইডির পাশাপাশি লকগুলি ক্যাপচার করতে আমি একটি ডায়নামিক ম্যানেজমেন্ট ভিউ (ডিএমভি) ব্যবহার করি।

(অবজেক্ট_আইডি পেতে আপনি যে ডেটাবেসটি পর্যবেক্ষণ করতে চান তা স্যুইচ করা আবশ্যক)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;

আমি এই বিবৃতিটি কোনও প্রক্রিয়াটির অপেক্ষায় থাকা অবজেক্টগুলি সন্ধানের জন্য ব্যবহার করার চেষ্টা করছি। আমি পরিষ্কারভাবে দেখতে পাচ্ছি যে একটি সেশন অপরটির জন্য sp_who2এবং ব্যবহারের জন্য অপেক্ষা করছে sys.dm_os_waiting_task(উভয়ই একই টেবিলটি আপডেট করার চেষ্টা করছে)। তবে আপনার বক্তব্যটি কোনও সারি ফেরায় না। কোন ধারনা?
a_horse_with_no_name

17

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


5

আপনি নীচের স্ক্রিপ্টের মাধ্যমে বিশদটি পেতে পারেন।

-- List all Locks of the Current Database 
SELECT TL.resource_type AS ResType 
      ,TL.resource_description AS ResDescr 
      ,TL.request_mode AS ReqMode 
      ,TL.request_type AS ReqType 
      ,TL.request_status AS ReqStatus 
      ,TL.request_owner_type AS ReqOwnerType 
      ,TAT.[name] AS TransName 
      ,TAT.transaction_begin_time AS TransBegin 
      ,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura 
      ,ES.session_id AS S_Id 
      ,ES.login_name AS LoginName 
      ,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName 
      ,PARIDX.name AS IndexName 
      ,ES.host_name AS HostName 
      ,ES.program_name AS ProgramName 
FROM sys.dm_tran_locks AS TL 
     INNER JOIN sys.dm_exec_sessions AS ES 
         ON TL.request_session_id = ES.session_id 
     LEFT JOIN sys.dm_tran_active_transactions AS TAT 
         ON TL.request_owner_id = TAT.transaction_id 
            AND TL.request_owner_type = 'TRANSACTION' 
     LEFT JOIN sys.objects AS OBJ 
         ON TL.resource_associated_entity_id = OBJ.object_id 
            AND TL.resource_type = 'OBJECT' 
     LEFT JOIN sys.partitions AS PAR 
         ON TL.resource_associated_entity_id = PAR.hobt_id 
            AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT') 
     LEFT JOIN sys.objects AS PAROBJ 
         ON PAR.object_id = PAROBJ.object_id 
     LEFT JOIN sys.indexes AS PARIDX 
         ON PAR.object_id = PARIDX.object_id 
            AND PAR.index_id = PARIDX.index_id 
WHERE TL.resource_database_id  = DB_ID() 
      AND ES.session_id <> @@Spid -- Exclude "my" session 
      -- optional filter  
      AND TL.request_mode <> 'S' -- Exclude simple shared locks 
ORDER BY TL.resource_type 
        ,TL.request_mode 
        ,TL.request_type 
        ,TL.request_status 
        ,ObjectName 
        ,ES.login_name;



--TSQL commands
SELECT 
       db_name(rsc_dbid) AS 'DATABASE_NAME',
       case rsc_type when 1 then 'null'
                             when 2 then 'DATABASE' 
                             WHEN 3 THEN 'FILE'
                             WHEN 4 THEN 'INDEX'
                             WHEN 5 THEN 'TABLE'
                             WHEN 6 THEN 'PAGE'
                             WHEN 7 THEN 'KEY'
                             WHEN 8 THEN 'EXTEND'
                             WHEN 9 THEN 'RID ( ROW ID)'
                             WHEN 10 THEN 'APPLICATION' end  AS 'REQUEST_TYPE',

       CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
                                     WHEN 2 THEN 'CURSOR'
                                     WHEN 3 THEN 'SESSION'
                                     WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',

       OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME', 
       PROCESS.HOSTNAME , 
       PROCESS.program_name , 
       PROCESS.nt_domain , 
       PROCESS.nt_username , 
       PROCESS.program_name ,
       SQLTEXT.text 
FROM sys.syslockinfo LOCK JOIN 
     sys.sysprocesses PROCESS
  ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()



--Lock on a specific object
SELECT * 
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.