2009-03-29 12 views

Trả lời

94

Để thêm vào các phản hồi khác, sp_lock cũng có thể được sử dụng để đổ toàn bộ thông tin khóa trên tất cả các quy trình đang chạy. Đầu ra có thể được áp đảo, nhưng nếu bạn muốn biết chính xác những gì bị khóa, đó là một giá trị để chạy. Tôi thường sử dụng nó cùng với sp_who2 để nhanh chóng không ở trong các vấn đề về khóa.

Có nhiều phiên bản khác nhau của thủ tục "thân thiện hơn" sp_lock có sẵn trực tuyến, tùy thuộc vào phiên bản SQL Server được đề cập.

Trong trường hợp của bạn, đối với SQL Server 2005, sp_lock vẫn có sẵn nhưng không được chấp nhận, vì vậy, bây giờ bạn nên sử dụng chế độ xem sys.dm_tran_locks cho loại điều này. Bạn có thể tìm thấy ví dụ về cách "cuộn" chức năng sp_lock của riêng bạn here.

80

Điều này không cho bạn biết hàng nào bị khóa nhưng điều này có thể hữu ích cho bạn.

Bạn có thể kiểm tra báo cáo bị chặn bằng cách chạy này:

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

Nó cũng sẽ cho bạn biết mỗi khối được chờ đợi trên. Vì vậy, bạn có thể theo dõi tất cả các con đường để xem câu lệnh nào gây ra khối đầu tiên gây ra các khối khác.

Sửa để thêm bình luận từ @MikeBlandford:

Cột chặn chỉ ra spid của quá trình chặn. Bạn có thể chạy kill {spid} để sửa nó.

+7

Cột bị chặn cho biết nguyên nhân của quá trình chặn. Bạn có thể chạy kill {spid} để sửa nó. –

16

Bạn cũng có thể sử dụng quy trình được lưu sẵn trong sp_who2 để chặn các quy trình chặn và chặn hiện tại trên phiên bản SQL Server. Thông thường bạn sẽ chạy điều này cùng với một cá thể SQL Profiler để tìm một quá trình chặn và xem lệnh gần đây nhất mà spid được phát hành trong profiler.

28

Tôi sử dụng Chế độ xem quản lý động (DMV) để nắm bắt khóa cũng như object_id hoặc partition_id của mục bị khóa.

(PHẢI chuyển sang cơ sở dữ liệu bạn muốn quan sát để có được object_id)

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; 
+0

Tôi đang cố gắng sử dụng câu lệnh này để tìm ra các đối tượng mà một quá trình đang chờ đợi. Tôi có thể thấy rõ một phiên đang đợi một phiên khác bằng cách sử dụng 'sp_who2' và' sys.dm_os_waiting_task' (cả hai cố gắng cập nhật cùng một bảng). Nhưng tuyên bố của bạn không trả lại bất kỳ hàng nào. Bất kỳ ý tưởng? –

18

Bạn có thể tìm thấy hiện ổ khóa trên bàn của bạn bằng cách làm theo truy vấn.

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'); 

Xem sys.dm_tran_locks

Nếu nhiều trường hợp của cùng request_owner_type tồn tại, request_owner_id cột được sử dụng để phân biệt mỗi trường hợp.Đối với các giao dịch được phân phối, các số request_owner_type và các cột request_owner_guid sẽ hiển thị thông tin đối tượng khác nhau.

Ví dụ: Phiên S1 sở hữu khóa chia sẻ trên Bảng 1; và giao dịch T1, đang chạy theo phiên S1, cũng sở hữu một khóa chia sẻ trên Bảng 1. Trong trường hợp này, cột resource_description được trả về bởi sys.dm_tran_locks sẽ hiển thị hai phiên bản của cùng một tài nguyên. Cột request_owner_type sẽ hiển thị một phiên bản dưới dạng phiên và một phiên làm giao dịch. Ngoài ra, cột resource_owner_id sẽ có các giá trị khác nhau.

Các vấn đề liên quan