ฉันกำลังพยายามทำความเข้าใจ / เรียนรู้วิธีติดตามรายละเอียดของเซสชันที่ถูกบล็อก
ดังนั้นฉันจึงสร้างการตั้งค่าต่อไปนี้:
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
แสดงต่อไปนี้ (ฉันลบบางคอลัมน์เพื่อแสดงเฉพาะข้อมูลสำคัญ):
SPID | สถานะ | BlkBy | DBName | คำสั่ง | SPID | requestID ----- + -------------- ------- + + + ---------- ---------- -------- + + ------ ---------- 52 | กำลังนอนหลับ . | อาหาร คำสั่งที่รอรับ 52 | 0 53 | กำลังนอนหลับ . | อาหาร คำสั่งที่รอรับ 53 | 0 54 | ระงับแล้ว 52 | อาหาร อัพเดท | 54 | 0 56 | RUNNABLE | . | อาหาร เลือกเป็น | 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;
ผลตอบแทน:
session_id | wait_type | resource_address | resource_description ----------- ----------- + + + -------------------- ----- -------------------------------------------------- -------------------------- 54 | LCK_M_X | 0x000000002a35cd40 | keylock hobtid = 72057594046054400 dbid = 6 id = โหมด lock4ed1dd780 = X ที่เกี่ยวข้อง ObbjectId = 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
คำสั่งจะถูกปิดกั้นแม้ว่าเราจะมีการแยกภาพรวมและอ่านภาพรวมความมุ่งมั่นที่เปิดใช้งาน การหาสาเหตุที่การเลือกถูกบล็อก (ซึ่งฉันคิดว่าคงเป็นไปไม่ได้หากเปิดใช้งานการแยกสแน็ปช็อต) เป็นขั้นตอนต่อไป
เป็นขั้นตอนแรกที่ผมต้องการที่จะหาในสิ่งที่เซสชั่นที่เป็นที่รอคอย