Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để tìm ra những gì đang khóa bảng của tôi?

Để đi thẳng đến "ai bị chặn / đang chặn", tôi đã kết hợp / viết tắt sp_who và sp_lock thành một truy vấn duy nhất, cung cấp cái nhìn tổng quan tốt đẹp về ai đã khóa đối tượng ở cấp độ nào.

--Create Procedure WhoLock
--AS
set nocount on
if object_id('tempdb..#locksummary') is not null Drop table #locksummary
if object_id('tempdb..#lock') is not null Drop table #lock
create table #lock (    spid int,    dbid int,    objId int,    indId int,    Type char(4),    resource nchar(32),    Mode char(8),    status char(6))
Insert into #lock exec sp_lock
if object_id('tempdb..#who') is not null Drop table #who
create table #who (     spid int, ecid int, status char(30),
            loginame char(128), hostname char(128),
            blk char(5), dbname char(128), cmd char(16)
            --
            , request_id INT --Needed for SQL 2008 onwards
            --
         )
Insert into #who exec sp_who
Print '-----------------------------------------'
Print 'Lock Summary for ' + @@servername  + ' (excluding tempdb):'
Print '-----------------------------------------' + Char(10)
Select     left(loginame, 28) as loginame, 
    left(db_name(dbid),128) as DB,
    left(object_name(objID),30) as object,
    max(mode) as [ToLevel],
    Count(*) as [How Many],
    Max(Case When mode= 'X' Then cmd Else null End) as [Xclusive lock for command],
    l.spid, hostname
into #LockSummary
from #lock l join #who w on l.spid= w.spid
where dbID != db_id('tempdb') and l.status='GRANT'
group by dbID, objID, l.spid, hostname, loginame

Select * from #LockSummary order by [ToLevel] Desc, [How Many] Desc, loginame, DB, object

Print '--------'
Print 'Who is blocking:'
Print '--------' + char(10)
SELECT p.spid
,convert(char(12), d.name) db_name
, program_name
, p.loginame
, convert(char(12), hostname) hostname
, cmd
, p.status
, p.blocked
, login_time
, last_batch
, p.spid
FROM      master..sysprocesses p
JOIN      master..sysdatabases d ON p.dbid =  d.dbid
WHERE     EXISTS (  SELECT 1
          FROM      master..sysprocesses p2
          WHERE     p2.blocked = p.spid )

Print '--------'
Print 'Details:'
Print '--------' + char(10)
Select     left(loginame, 30) as loginame,  l.spid,
    left(db_name(dbid),15) as DB,
    left(object_name(objID),40) as object,
    mode ,
    blk,
    l.status
from #lock l join #who w on l.spid= w.spid
where dbID != db_id('tempdb') and blk <>0
Order by mode desc, blk, loginame, dbID, objID, l.status

(Để biết ý nghĩa của từ viết tắt cấp khóa, hãy xem ví dụ:https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx)

Được sao chép từ:sp_WhoLock - một proc được lưu trữ T-SQL kết hợp sp_who và sp_lock ...

NB cột [Xclusive lock for command] có thể gây hiểu nhầm - nó hiển thị lệnh hiện tại cho spid đó; nhưng khóa X có thể đã được kích hoạt bởi một lệnh trước đó trong giao dịch.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng PIVOT trong SQL Server 2008

  2. Cách bật quyền hàng loạt trong SQL Server

  3. Các loại con trỏ máy chủ SQL - Con trỏ tĩnh trong SQL Server là gì | Hướng dẫn sử dụng SQL Server / TSQL

  4. Làm cách nào để tạo một số ngẫu nhiên cho mỗi hàng trong một lựa chọn T-SQL?

  5. Làm thế nào để bạn trả lại các tên cột của một bảng?