আমি কীভাবে একটি অবরুদ্ধ অধিবেশনটির বিবরণ সন্ধান করতে / বুঝতে চেষ্টা করছি 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 আউট কেন নির্বাচন অবরুদ্ধ করা হয়েছে (যা আমি ভেবেছিলাম সম্ভব হবে না যদি স্ন্যাপশট বিচ্ছিন্নতা সক্ষম হয়) পরবর্তী ধাপে হবে।
প্রথম পদক্ষেপ হিসাবে আমি সেশনটি কী অপেক্ষা করছে তা সন্ধান করতে চাই ।