SQL Server死在同一个objid上

时间:2015-09-14 14:19:43

标签: sql-server hibernate database-deadlocks

有时我们的应用程序会在一个特定的表上看到死锁。该数据库是16处理器SQL Server 2012(Build 7601:Service Pack 1),SQL由hibernate生成。从死锁图中我看到一个事务中有一个删除SQL,另一个事务中有一个更新SQL。我从图中无法理解的是,所有者资源和所请求资源的objid是相同的。如果它已经拥有该记录的锁定,为什么该事务要求锁定同一个对象?我阅读了Brad McGehee的文章https://www.simple-talk.com/sql/learn-sql-server/how-to-track-down-deadlocks-using-sql-server-2005-profiler/和其他msdn文档,但它们都解释了拥有的资源和请求的资源不同的情况。对不起,这是我在stackoverflow上的第一篇帖子,所以如果我的帖子没有提供足够的信息,请告诉我。

    <deadlock-list>
     <deadlock victim="process8fc64dc38">
     <process-list>
       <process id="process8fc64dc38" taskpriority="0" logused="348" waitresource="KEY: 5:72057594042843136 (83d75ea09649)" waittime="3635" ownerId="64693878583" transactionname="implicit_transaction" lasttranstarted="2015-09-11T12:49:54.470" XDES="0x8e917f838" lockMode="U" schedulerid="16" kpid="1920" status="suspended" spid="98" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-11T12:49:54.480" lastbatchcompleted="2015-09-11T12:49:54.480" lastattention="1900-01-01T00:00:00.480" clientapp="Microsoft SQL Server JDBC Driver" hostname="TSC-APP" hostpid="0" loginname="atms" isolationlevel="read committed (2)" xactid="64693878583" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
       <executionStack>
     <frame procname="adhoc" line="1" stmtstart="568" sqlhandle="0x020000000336ba1ffcbedac90f190fce2fde4a3bac3cc5e80000000000000000000000000000000000000000">
    update dms_priority_queue set priority=@P0, owner=@P1, active=@P2, start_date=@P3, position=@P4, end_date=@P5, action_type=@P6, audit_date=@P7, message=@P8, beacon=@P9, delay=@P10, submit_time=@P11, audit_user=@P12, priority_key=@P13, associated_type=@P14, associated=@P15, dow_repeat=@P16 where device_id=@P17 and entry_id=@P18     </frame>
    </executionStack>
    <inputbuf>
    (@P0 int,@P1 nvarchar(4000),@P2 bit,@P3 datetime2,@P4 int,@P5 datetime2,@P6 nvarchar(4000),@P7 datetime2,@P8 nvarchar(4000),@P9 bit,@P10 int,@P11 datetime2,@P12 nvarchar(4000),@P13 nvarchar(4000),@P14 nvarchar(4000),@P15 varchar(8000),@P16 nvarchar(4000),@P17 int,@P18 nvarchar(4000))update dms_priority_queue set priority=@P0, owner=@P1, active=@P2, start_date=@P3, position=@P4, end_date=@P5, action_type=@P6, audit_date=@P7, message=@P8, beacon=@P9, delay=@P10, submit_time=@P11, audit_user=@P12, priority_key=@P13, associated_type=@P14, associated=@P15, dow_repeat=@P16 where device_id=@P17 and entry_id=@P18                                                                                                                                                       </inputbuf>
       </process>
       <process id="process8fc04d498" taskpriority="0" logused="948" waitresource="KEY: 5:72057594042843136 (0c15a51ae59f)" waittime="3631" ownerId="64693878466" transactionname="implicit_transaction" lasttranstarted="2015-09-11T12:49:54.467" XDES="0x7ac1e03a8" lockMode="X" schedulerid="8" kpid="10364" status="suspended" spid="144" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2015-09-11T12:49:54.487" lastbatchcompleted="2015-09-11T12:49:54.487" lastattention="1900-01-01T00:00:00.487" clientapp="Microsoft SQL Server JDBC Driver" hostname="TSC-APP" hostpid="0" loginname="atms" isolationlevel="read committed (2)" xactid="64693878466" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
        <executionStack>
     <frame procname="adhoc" line="1" stmtstart="56" sqlhandle="0x02000000bd9f3034c4569fe476061660252530233735d0640000000000000000000000000000000000000000">
delete from dms_priority_queue where device_id=@P0 and entry_id=@P1     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
        (@P0 int,@P1 nvarchar(4000))delete from dms_priority_queue where device_id=@P0 and entry_id=@P1                    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <keylock hobtid="72057594042843136" dbid="5" objectname="nwatms2.dbo.dms_priority_queue" indexname="pk_dms_priority_queue" id="lock7b664d300" mode="X" associatedObjectId="72057594042843136">
    <owner-list>
     <owner id="process8fc04d498" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process8fc64dc38" mode="U" requestType="wait"/>
    </waiter-list>
   </keylock>
   <keylock hobtid="72057594042843136" dbid="5" objectname="nwatms2.dbo.dms_priority_queue" indexname="pk_dms_priority_queue" id="lock3533d6280" mode="X" associatedObjectId="72057594042843136">
    <owner-list>
     <owner id="process8fc64dc38" mode="X"/>
    </owner-list>
    <waiter-list>
     <waiter id="process8fc04d498" mode="X" requestType="wait"/>
    </waiter-list>
   </keylock>
  </resource-list>
 </deadlock>

1 个答案:

答案 0 :(得分:0)

有问题的锁(密钥锁)会影响表中的范围,而不影响整个表。 See MSDN on Lock Granularity and Hierarchies

在这种情况下,两个进程中的每一个都在mode=X内的单个范围内拥有一个独占锁(dms_priority_queue),但是正在等待锁定同一个表中的其他范围。 / p>