Sql server 获取死锁图中涉及的对象

Sql server 获取死锁图中涉及的对象,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我们的一个应用程序面临死锁问题,下面是获得的sql日志。我无法解释确切的问题 有人能帮我理解这个吗 这是从SQL日志获取的等待时间图 `Node:1 KEY: 8:72057594538426368 (e1e76d2c41ad) CleanCnt:2 Mode:RangeX-X Flags: 0x1 Grant List 1: Owner:0x00000001511ACE00 Mode: RangeX-X Flg:0x40 Ref:0 Life:02000000 SPID:95 EC

我们的一个应用程序面临死锁问题,下面是获得的sql日志。我无法解释确切的问题

有人能帮我理解这个吗

这是从SQL日志获取的等待时间图

`Node:1  
KEY: 8:72057594538426368 (e1e76d2c41ad) CleanCnt:2 Mode:RangeX-X Flags: 0x1
 Grant List 1:
   Owner:0x00000001511ACE00 Mode: RangeX-X Flg:0x40 Ref:0 Life:02000000 SPID:95 ECID:0 XactLockInfo: 0x000000019F52F990
   SPID: 95 ECID: 0 Statement Type: CONDITIONAL Line #: 143
   Input Buf: RPC Event: Proc [Database Id = 8 Object Id = 1003150619]
Requested by: 
  ResType:LockOwner Stype:'OR'Xdes:0x00000001FAE1A3B0 Mode: RangeS-S SPID:97 BatchID:0 ECID:0 TaskProxy:(0x00000001F42BA540) Value:0x9f71a8c0 Cost:(0/1228)
NULL
Node:2  
KEY: 8:72057594538426368 (79a08f80fbf1) CleanCnt:2 Mode:X Flags: 0x1
 Grant List 1:
   Owner:0x00000001CDD00940 Mode: X        Flg:0x40 Ref:0 Life:02000000 SPID:97 ECID:0 XactLockInfo: 0x00000001FAE1A3F0
   SPID: 97 ECID: 0 Statement Type: CONDITIONAL Line #: 143
   Input Buf: RPC Event: Proc [Database Id = 8 Object Id = 1003150619]
Requested by: 
  ResType:LockOwner Stype:'OR'Xdes:0x000000019F52F950 Mode: RangeS-S SPID:95 BatchID:0 ECID:0 TaskProxy:(0x00000001A4432540) Value:0x5d929e80 Cost:(0/2312)
NULL
Victim Resource Owner:
 ResType:LockOwner Stype:'OR'Xdes:0x00000001FAE1A3B0 Mode: RangeS-S SPID:97 BatchID:0 ECID:0 TaskProxy:(0x00000001F42BA540) Value:0x9f71a8c0 Cost:(0/1228)
deadlock-list
 deadlock victim=process807dfdc8
  process-list
   process id=process807dfdc8 taskpriority=0 logused=1228 waitresource=KEY: 8:72057594538426368 (e1e76d2c41ad) waittime=2828 ownerId=775643922 transactionname=user_transaction lasttranstarted=2015-02-02T09:24:00.767 XDES=0x1fae1a3b0 lockMode=RangeS-S schedulerid=2 kpid=7948 status=suspended spid=97 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-02-02T09:24:00.767 lastbatchcompleted=2015-02-02T09:24:00.763 clientapp=.Net SqlClient Data Provider hostname=servername1 hostpid=11600 loginname=ABC isolationlevel=serializable (4) xactid=775643922 currentdb=8 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
    executionStack
     frame procname=ABC.dbo.usp_UpdateFun line=143 stmtstart=11630 stmtend=12584 sqlhandle=0x030008001bddca3b985a410027a400000100000000000000
IF EXISTS                 
 (                
  SELECT a.*                
  FROM                
   tblBookings a                
   INNER JOIN OPENXML(@doc, 'EventRequest/Bookings', 2) WITH (resourceId int) b ON a.resourceId = b.resourceId                
  WHERE                
   (a.start > @start OR a.finish > @start) AND                 
   (a.start < @finish OR a.finish < @finish)                
 )     
    inputbuf
Proc [Database Id = 8 Object Id = 1003150619]    
   process id=process807dfb88 taskpriority=0 logused=2312 waitresource=KEY: 8:72057594538426368 (79a08f80fbf1) waittime=4107 ownerId=775643278 transactionname=user_transaction lasttranstarted=2015-02-02T09:23:58.540 XDES=0x19f52f950 lockMode=RangeS-S schedulerid=2 kpid=11876 status=suspended spid=95 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-02-02T09:23:58.540 lastbatchcompleted=2015-02-02T09:23:58.540 clientapp=.Net SqlClient Data Provider hostname=servername1 hostpid=11600 loginname=ABC isolationlevel=serializable (4) xactid=775643278 currentdb=8 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
    executionStack
     frame procname=ABC.dbo.usp_UpdateFun line=143 stmtstart=11630 stmtend=12584 sqlhandle=0x030008001bddca3b985a410027a400000100000000000000
IF EXISTS                 
 (                
  SELECT a.*                
  FROM                
   tblBookings a                
   INNER JOIN OPENXML(@doc, 'EventRequest/Bookings', 2) WITH (resourceId int) b ON a.resourceId = b.resourceId                
  WHERE                
   (a.start > @start OR a.finish > @start ) AND                 
   (a.start < @finish OR a.finish < @finish )                
 )     
    inputbuf
Proc [Database Id = 8 Object Id = 1003150619]    
  resource-list
   keylock hobtid=72057594538426368 dbid=8 objectname=ABC.dbo.tblBookings indexname=IX5_tblBookings id=lock18c90fe00 mode=RangeX-X associatedObjectId=72057594538426368
    owner-list
     owner id=process807dfb88 mode=RangeX-X
    waiter-list
     waiter id=process807dfdc8 mode=RangeS-S requestType=wait
   keylock hobtid=72057594538426368 dbid=8 objectname=ABC.dbo.tblBookings indexname=IX5_tblBookings id=lock1d2d12d80 mode=X associatedObjectId=72057594538426368
    owner-list
     owner id=process807dfdc8 mode=X
    waiter-list
     waiter id=process807dfb88 mode=RangeS-S requestType=wait`

如果您想让我添加更多信息,请告诉我。

您那里有很多信息。有2个会话,SPID:97在对象ID 1003150619上有一个锁。是RangeX-X类型的锁。然后SPID:95具有RangeS-S锁。死锁的受害者是SPID:97

Jonathan Kehayias的这篇文章应该会有所帮助。有关每个条目的详细信息,请参见。你可以在这里找到许多关于如何阅读和处理死锁的示例。以及一个关于如何分析上的死锁的详细示例

这里有一些查询肯定会帮助您开始了解死锁中涉及的对象,并了解发生了什么

--get details on which object the hobt_id is representing
SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id)
FROM   sys.partitions
WHERE  hobt_id IN (72057594538426368);

--get information on tsql been executed, if still available
SELECT * FROM sys.dm_exec_sql_text(0x030008001bddca3b985a410027a400000100000000000000);

SELECT OBJECT_NAME(p.object_id)  AS TableName,
       i.name                    AS IndexName
FROM   sys.partitions            AS p
       INNER JOIN sys.indexes    AS i
            ON  p.object_id = i.object_id
            AND p.index_id = i.index_id
WHERE  partition_id = 1003150619

SELECT   OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], 
         I.[NAME] AS [INDEX NAME], 
         USER_SEEKS, 
         USER_SCANS, 
         USER_LOOKUPS, 
         USER_UPDATES 
FROM     SYS.DM_DB_INDEX_USAGE_STATS AS S 
         INNER JOIN SYS.INDEXES AS I 
           ON I.[OBJECT_ID] = S.[OBJECT_ID] 
              AND I.INDEX_ID = S.INDEX_ID 
WHERE    OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
    AND I.[object_id] = 1003150619

我在数据库中验证了这个id,发现1003150619是一个存储过程,而不是表。。我们也能锁定SP吗??抱歉,如果我问了一个愚蠢的问题,那只是我对答案评论的开始。我无法访问您的数据库,因此我不可能知道这些ID所属对象的类型。如果是sp,则检查导致死锁的语句。我发布的查询对于表和索引很有用。