死锁:密钥锁资源列表中的属性模式与所有者列表模式不同

时间:2011-12-09 07:22:55

标签: sql-server sql-server-2008 tsql deadlock error-log

我最近在我们的应用程序中遇到了一些死锁情况,并且有一个对我来说很奇怪的新案例。错误日志显示此信息(没有执行堆栈,我相信此时无关紧要):

deadlock-list
  deadlock victim=process84db88
   process-list
    process id=process84db88 taskpriority=0 logused=0 waitresource=KEY: 11:72057594409844736 (8194443284a0) waittime=4685 ownerId=3632385974 transactionname=SELECT lasttranstarted=2011-12-07T16:21:16.287 XDES=0x32f68fca0 lockMode=S schedulerid=6 kpid=6392 status=suspended spid=93 sbid=0 ecid=0 priority=0 trancount=0 lastbatchstarted=2011-12-07T16:21:16.287 lastbatchcompleted=2011-12-07T16:21:16.287 clientapp=.Net SqlClient Data Provider hostname=DE-1809 hostpid=4156 loginname=XXX isolationlevel=read committed (2) xactid=3632385974 currentdb=11 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
     executionStack
      ........   
    process id=process47bdc8 taskpriority=0 logused=240604 waitresource=KEY: 11:72057594409844736 (829df5d1e88e) waittime=4681 ownerId=3632397262 transactionname=UPDATE lasttranstarted=2011-12-07T16:21:26.100 XDES=0x2f00b93c0 lockMode=X schedulerid=1 kpid=6568 status=suspended spid=88 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2011-12-07T16:21:25.640 lastbatchcompleted=2011-12-07T16:21:25.640 clientapp=.Net SqlClient Data Provider hostname=DE-1809 hostpid=4156 loginname=XXX isolationlevel=read committed (2) xactid=3632397262 currentdb=11 lockTimeout=4294967295 clientoption1=673316896 clientoption2=128056
     executionStack
      .........  
   resource-list
    keylock hobtid=72057594409844736 dbid=11 objectname=dbo.OurTable indexname=PK_OurTable id=lock1d9aa0b00 mode=X associatedObjectId=72057594409844736
     owner-list
      owner id=process47bdc8 mode=X
     waiter-list
      waiter id=process84db88 mode=S requestType=wait
    keylock hobtid=72057594409844736 dbid=11 objectname=dbo.OurTable indexname=PK_OurTable id=lock1a56cb580 mode=U associatedObjectId=72057594409844736
     owner-list
      owner id=process84db88 mode=S
     waiter-list
      waiter id=process47bdc8 mode=X requestType=convert

锁定发生在我们其中一个表的同一聚簇索引中的某个键上。令我困惑的是资源列表中最后一个键锁行的模式。

它说: mode = U ,而相应所有者列表中的所有者说: mode = S

我该怎么看?这两种模式通常是相同的。这些模式有何不同?

2 个答案:

答案 0 :(得分:3)

我认为这意味着process47bdc8对该资源有一个U锁,并且正在等待将其转换为X锁,但不能将process84db88锁定为S已经锁定了S

U锁和{{1}}锁are compatible

答案 1 :(得分:1)

来自MSDN的引用可能会提供解释:

  

为避免此潜在的死锁问题,使用更新(U)锁。   只有一个事务可以获取对资源的更新(U)锁定   时间。如果事务修改资源,则更新(U)锁定   转换为独占(X)锁定。否则,转换锁   到共享模式锁。

因此,请求共享锁的一个事务(可能是第一个)最终会持有Update锁。如果想要进行更新,Update锁只会为事务提供转换为eXclusive锁的选项。

如果两个事务读取然后写入同一行,则此机制会有所帮助。在你的情况下,有两行在玩。第一个事务在行A上有一个独占锁,并且正在等待转换为行B上的独占锁。第二个事务在行B上有一个共享锁,它实际上是一个Update锁,它正在等待行上的独占锁甲