Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

कैसे पता करें कि मेरी टेबल को क्या लॉक कर रहा है?

सीधे "कौन अवरुद्ध/अवरुद्ध कर रहा है" तक पहुंचने के लिए मैंने sp_who और sp_lock को एक ही क्वेरी में जोड़ दिया/संक्षिप्त कर दिया, जो इस बात का एक अच्छा अवलोकन देता है कि किसके पास किस स्तर पर किस वस्तु को लॉक किया गया है।

--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

(लॉक स्तर के संक्षिप्ताक्षरों का क्या अर्थ है, उदाहरण के लिए देखें https://technet.microsoft.com/en-us/library/ms175519%28v=sql.105%29.aspx)

से कॉपी किया गया:sp_WhoLock - sp_who और sp_lock को मिलाकर एक T-SQL संग्रहित प्रो...

एनबी [कमांड के लिए एक्सक्लूसिव लॉक] कॉलम भ्रामक हो सकता है - यह उस स्पिड के लिए वर्तमान कमांड दिखाता है; लेकिन X लॉक को लेन-देन में पहले के आदेश द्वारा ट्रिगर किया जा सकता था।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या आप इन मेट्रिक्स के साथ SQL सर्वर के प्रदर्शन को माप रहे हैं?

  2. इसमें डालें... मर्ज करें... चुनें (एसक्यूएल सर्वर)

  3. वीएस2012 में स्थानीय डीबी से कनेक्ट करने में असमर्थ - SQL सर्वर से कनेक्शन स्थापित करते समय नेटवर्क से संबंधित या इंस्टेंस-विशिष्ट त्रुटि उत्पन्न हुई ...

  4. SQL सर्वर प्रबंधन स्टूडियो में क्वेरी इतिहास कैसे देखें

  5. दो SQL सर्वर डेटाबेस की तुलना करने के लिए एक निःशुल्क टूल क्या है?