Tôi đang cố gắng hiểu / tìm hiểu cách theo dõi chi tiết của phiên bị chặn.
Vì vậy, tôi đã tạo ra các thiết lập sau:
create table foo (id integer not null primary key, some_data varchar(20));
insert into foo values (1, 'foo');
commit;
Bây giờ tôi kết nối với cơ sở dữ liệu hai lần từ hai khách hàng khác nhau.
Các vấn đề phiên đầu tiên:
begin transaction
update foo set some_data = 'update'
where id = 1;
Tôi rõ ràng không cam kết ở đó để giữ các khóa.
Trong phiên thứ hai, tôi đưa ra tuyên bố tương tự và tất nhiên người ta chờ đợi do bị khóa. Bây giờ tôi đang cố gắng sử dụng các truy vấn khác nhau trôi nổi để xem phiên 2 đang chờ foo
bảng.
sp_who2
hiển thị như sau (Tôi đã xóa một số cột để chỉ hiển thị thông tin quan trọng):
SPID | Tình trạng | BlkBy | DBName | Lệnh | SPID | YÊU CẦU ID ----- + -------------- + ------- + ---------- + ---------- -------- + ------ + ---------- 52 | ngủ | . | thức ăn | TUYỆT VỜI | 52 | 0 53 | ngủ | . | thức ăn | TUYỆT VỜI | 53 | 0 54 | XÁC NHẬN | 52 | thức ăn | CẬP NHẬT | 54 | 0 56 | CHẠY | . | thức ăn | CHỌN VÀO | 56 | 0
Điều này được mong đợi, phiên 54 bị chặn bởi những thay đổi không được cam kết từ phiên 52.
Truy vấn sys.dm_os_waiting_tasks
cũng cho thấy điều này. Tuyên bố:
select session_id, wait_type, resource_address, resource_description
from sys.dm_os_waiting_tasks
where blocking_session_id is not null;
trả về:
phiên_id | chờ đợi resource_address | resource_descrip ----------- + ----------- + -------------------- + ----- -------------------------------------------------- -------------------------- 54 | LCK_M_X | 0x000000002a35cd40 | khóa móc hobtid = 72057594046054400 dbid = 6 id = lock4ed1dd780 mode = X AssociObjectId = 72057594046054400
Một lần nữa điều này được mong đợi.
Vấn đề của tôi là, tôi không thể tìm ra cách tìm tên đối tượng thực tế mà phiên 54 đang chờ.
Tôi đã tìm thấy một số truy vấn đang tham gia sys.dm_tran_locks
và sys.dm_os_waiting_tasks
như thế này:
SELECT ....
FROM sys.dm_tran_locks AS l
JOIN sys.dm_os_waiting_tasks AS wt ON wt.resource_address = l.lock_owner_address
Nhưng trong kịch bản thử nghiệm ở trên của tôi, sự tham gia này không trả lại bất cứ điều gì. Vì vậy, tham gia đó là sai hoặc dm_tran_locks
không thực sự chứa thông tin tôi đang tìm kiếm.
Vì vậy, điều tôi đang tìm kiếm là một truy vấn trả về một cái gì đó như:
" phiên 54 đang chờ khóa trong bảngfoo
".
Một số thông tin cơ bản:
Vấn đề thực tế mà tôi đang cố gắng giải quyết phức tạp hơn một chút, nhưng tập trung vào câu hỏi "trên bàn nào đang chờ phiên 54". Vấn đề được đề cập liên quan đến một thủ tục được lưu trữ lớn, cập nhật một số bảng và chọn từ một khung nhìn truy cập vào một số các bảng đó. Các select
tuyên bố bị chặn mặc dù chúng ta có cách ly bản chụp và đọc bản chụp cam kết kích hoạt. Tìm hiểu tại sao lựa chọn bị chặn (mà tôi nghĩ sẽ không thể thực hiện được nếu cách ly ảnh chụp nhanh được bật) sẽ là bước tiếp theo.
Bước đầu tiên tôi muốn tìm hiểu xem phiên đó đang chờ đợi điều gì .