এসকিউএল সার্ভারে লক করা টেবিল বা সারি সনাক্ত করা


20

আমি কীভাবে একটি অবরুদ্ধ অধিবেশনটির বিবরণ সন্ধান করতে / বুঝতে চেষ্টা করছি learn

সুতরাং আমি নিম্নলিখিত সেটআপটি তৈরি করেছি:

create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;

এখন আমি দুটি পৃথক ক্লায়েন্টের কাছ থেকে দুবার ডাটাবেসে সংযুক্ত হয়েছি।

প্রথম সেশনের বিষয়গুলি:

begin transaction
update foo set some_data = 'update'
  where id = 1;

আমি লক রাখতে সেখানে স্পষ্টভাবে প্রতিশ্রুতিবদ্ধ না

দ্বিতীয় সেশনে আমি একই বিবৃতিটি জারি করি এবং অবশ্যই এটি লক হওয়ার কারণে অপেক্ষা করে। সেশন 2 fooসারণীর অপেক্ষায় আছে তা দেখার জন্য এখন আমি প্রায় ভাসমান বিভিন্ন প্রশ্নগুলি ব্যবহার করার চেষ্টা করছি ।

sp_who2 নিম্নলিখিতটি দেখায় (কেবলমাত্র গুরুত্বপূর্ণ তথ্যটি দেখানোর জন্য আমি কয়েকটি কলাম সরিয়েছি):

এসপিআইডি | স্ট্যাটাস | ব্লকবি | ডিবিনেম | আদেশ | এসপিআইডি | REQUESTID
----- + + -------------- + + ------- + + ---------- + + ---------- -------- + + ------ + + ----------
52 | ঘুমন্ত | । | ফুডব | অপেক্ষারত কম্যান্ড | 52 | 0        
53 | ঘুমন্ত | । | ফুডব | অপেক্ষারত কম্যান্ড | 53 | 0        
54 | বরাদ্দ | 52 | ফুডব | আপডেট | 54 | 0        
56 | চালানো | । | ফুডব | নির্বাচন করুন | 56 | 0        

এটি প্রত্যাশিত, সেশন 54 সেশন 52 থেকে অ-প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলি দ্বারা অবরুদ্ধ।

অনুসন্ধান sys.dm_os_waiting_tasksকরাও এটি দেখায়। বিবৃতি:

select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;

আয়:

সেশন_আইডি | অপেক্ষা_প্রকার | রিসোর্স_এড্রেস | resource_description                                                            
----------- + + ----------- + + -------------------- + + ----- -------------------------------------------------- --------------------------
        54 | এলসিকে_এম_এক্স | 0x000000002a35cd40 | কীলক হবিটিড = 72057594046054400 ডিবিড = 6 আইডি = লক 4 এড 1 ডি 780 মোড = এক্স সম্পর্কিতঅবজেক্টআইডি = 72057594046054400

আবার এটি প্রত্যাশিত।

আমার সমস্যাটি হ'ল 54 সেশনের অপেক্ষায় থাকা প্রকৃত অবজেক্টের নামটি কীভাবে সন্ধান করব তা আমি বুঝতে পারি না।

আমি বেশ কয়েকটি ক্যোয়ারী পেয়েছি যা যোগদান করছে sys.dm_tran_locksএবং এর sys.dm_os_waiting_tasksমতো:

SELECT ....
FROM sys.dm_tran_locks AS l
  JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address

তবে আমার উপরের পরীক্ষার দৃশ্যে এই যোগদানটি কোনও কিছুই ফেরায় না। সুতরাং যেটি যোগ দিনটি ভুল বা dm_tran_locksআসলে আমি যে তথ্যটি সন্ধান করছি তা ধারণ করে না।

সুতরাং আমি যা খুঁজছি তা এমন একটি কোয়েরি যা এমন কিছু ফেরত দেয়:
" সেশন 54 সারণীতে লকটির জন্য অপেক্ষা করছেfoo "।


কিছু পটভূমি তথ্য:

আসল জীবনের যে সমস্যার সমাধান করার চেষ্টা করছি তা কিছুটা জটিল, তবে "কোন টেবিলে অধিবেশন 54 কোন টেবিলে অপেক্ষা করছে" এই প্রশ্নের জবাব দেয়। প্রশ্নের মধ্যে থাকা সমস্যার মধ্যে রয়েছে একটি লার্জিশালী স্টোরেজ প্রক্রিয়া যা বেশ কয়েকটি টেবিল আপডেট করে এবং এমন কোনও ভিউ থেকে একটি নির্বাচন নির্বাচন করে যা সেই টেবিলগুলির কয়েকটি অ্যাক্সেস করে। selectবিবৃতি অবরুদ্ধ করা হয়েছে যদিও আমরা স্ন্যাপশট বিচ্ছিন্নতা আছে এবং অঙ্গীকারবদ্ধ স্ন্যাপশট সক্রিয় করে পড়ুন। Figuring আউট কেন নির্বাচন অবরুদ্ধ করা হয়েছে (যা আমি ভেবেছিলাম সম্ভব হবে না যদি স্ন্যাপশট বিচ্ছিন্নতা সক্ষম হয়) পরবর্তী ধাপে হবে।

প্রথম পদক্ষেপ হিসাবে আমি সেশনটি কী অপেক্ষা করছে তা সন্ধান করতে চাই ।


msdn.microsoft.com/en-us/library/ms190345.aspx আপনার যোগদান সঠিক বলেছে।
ম্যাক্স ভার্নন

@ ম্যাক্স ভার্নন: এটি নিশ্চিত করার জন্য ধন্যবাদ তবে আমি তখন আরও বিভ্রান্ত। একটি লক এবং একটি অবরুদ্ধ অধিবেশন আছে যদিও আমি জানি কেন এটি কিছু ফেরায় না ?
a_horse_with_no_name

এসকিউএল সার্ভার ২০১২-এ আপনি যে সমস্যাটি দেখছেন তা আমি পুনরায় তৈরি করতে অক্ষম I আমি একটি পরীক্ষামূলক ডাটাবেস তৈরি করেছি, আরসিএসআই সক্ষম করেছি, আপনার টেবিলগুলি তৈরি করেছি এবং উভয় আপডেট বিবৃতি দৌড়েছি এবং আমি আপনার শেষ প্রশ্নের সাথে ফিরে আসা একটি সারি দেখছি।
ম্যাক্স ভার্নন

আপনি যদি আপনার লকগুলি সনাক্ত করতে ভিজ্যুয়াল সহায়তা চান তবে এসকিউএল লক ফাইন্ডার নামে একটি ওপেন সোর্স সরঞ্জাম উপলব্ধ রয়েছে। আপনি উত্সটি খুঁজে পেতে পারেন: github.com/LucBos/SqlLockFinder বা এক্সিকিউটেবলটি এটিকে ডাউনলোড করুন: sqllockfinder.com এছাড়াও আমরা কোডটিতে আপনার যে কোনও অবদান রাখতে পারি তা পছন্দ করি যাতে আমরা এটি আরও ভাল করে তুলতে পারি।
লুক বস

উত্তর:


23

আমি মনে করি এটি আপনার প্রয়োজন অনুসারে করে।

USE 'yourDB'
GO
SELECT  
    OBJECT_NAME(p.[object_id]) BlockedObject
FROM    sys.dm_exec_connections AS blocking
    INNER JOIN sys.dm_exec_requests blocked
        ON blocking.session_id = blocked.blocking_session_id
    INNER JOIN sys.dm_os_waiting_tasks waitstats
        ON waitstats.session_id = blocked.session_id
    INNER JOIN sys.partitions p ON SUBSTRING(resource_description, 
        PATINDEX('%associatedObjectId%', resource_description) + 19, 
        LEN(resource_description)) = p.partition_id

3

আপনি চেষ্টা করতে পারেন :

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