none
奇怪的死锁 求解释 RRS feed

  • 问题

  • 死锁的奇怪的地方:死锁设计到的表示heap表,但是对key发生死锁,但是对key进行等待,死锁设计到的hotbid,无法再sys.partitions查询到objectid

    线索:表中delete的where 字段,参数化传进来使用的是nvarchar,但是表中却是使用varchar

    死锁信息:

    复制代码
    <deadlock-list>
      <deadlock>
    <victim-list>
       <victimProcess id="processd245288"/>
       </victim-list>
    <process-list>
        <process id="processd245288" taskpriority="0" logused="0" waitresource="KEY: 7:72057594592690176 (6630517ab975)" waittime="811" ownerId="9523151791" transactionname="user_transaction" lasttranstarted="2013-11-22T14:31:17.393" XDES="0x54aa7b950" lockMode="U" schedulerid="31" kpid="2752" status="suspended" spid="96" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-11-22T14:31:17.393" lastbatchcompleted="2013-11-22T14:31:17.393" clientapp=".Net SqlClient Data Provider" hostname="WIN-D03SNI5P5VJ" hostpid="27716" loginname="tianyi" isolationlevel="read committed (2)" xactid="9523151791" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
         <executionStack>
          <frame procname="" line="1" stmtstart="52" sqlhandle="0x02000000daa8051aae1fa7d63016b7f92bff8cc79cd2601b">      </frame>
          <frame procname="" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">      </frame>
         </executionStack>
         <inputbuf> (@Name nvarchar(4000))delete from [a] where Uame=@Name    </inputbuf>
        </process>
        <process id="processd2274c8" taskpriority="0" logused="896" waitresource="KEY: 7:72057594592690176 (7f24bf9871b5)" waittime="810" ownerId="9523151781" transactionname="user_transaction" lasttranstarted="2013-11-22T14:31:17.387" XDES="0x3c692b3c0" lockMode="X" schedulerid="28" kpid="18272" status="suspended" spid="136" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-11-22T14:31:17.400" lastbatchcompleted="2013-11-22T14:31:17.397" clientapp=".Net SqlClient Data Provider" hostname="WIN-D03SNI5P5VJ" hostpid="27716" loginname="tianyi" isolationlevel="read committed (2)" xactid="9523151781" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
         <executionStack>
          <frame procname="" line="1" stmtstart="290" sqlhandle="0x020000003e2b5d0915ab458804135b710c76331b2acad94d">      </frame>
          <frame procname="" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">      </frame>
         </executionStack>
         <inputbuf> (@Time datetime,@ID int,@Gre int,@OerID int,@rID uniqueidentifier,@RUD nvarchar(4000),@Uame nvarchar(4000))INSERT INTO [a]([a],[CID],[rNe],[AddTime],[Gere],[RID],[OID]) VALUES(@ProduByUserID,@ClID,@Usame,@Adme,@Gee,@RD,@OID)    </inputbuf>
        </process>
       </process-list>
       <resource-list>
        <keylock hobtid="72057594592690176" dbid="7" objectname="" indexname="" id="lock8c9066380" mode="X" associatedObjectId="72057594592690176">
         <owner-list>
          <owner id="processd2274c8" mode="X"/>
         </owner-list>
         <waiter-list>
          <waiter id="processd245288" mode="U" requestType="wait"/>
         </waiter-list>
        </keylock>
        <keylock hobtid="72057594592690176" dbid="7" objectname="" indexname="" id="lock6d968ab80" mode="U" associatedObjectId="72057594592690176">
         <owner-list>
          <owner id="processd245288" mode="U"/>
         </owner-list>
         <waiter-list>
          <waiter id="processd2274c8" mode="X" requestType="wait"/>
         </waiter-list>
        </keylock>
       </resource-list>
      </deadlock>
     </deadlock-list> 
    复制代码

    http://www.cnblogs.com/Amaranthus/p/3438492.html 

    2013年11月22日 16:10

答案

全部回复

  • Does table have non-clustered index? Sql calls any indexed column as key.
    • 已标记为答案 Fanr-zh 2013年11月23日 4:13
    2013年11月22日 16:48
  • 非聚集索引是有的, 

    但是 delete 是走索引的,怎么和insert死锁的呢?

    • 已编辑 Fanr-zh 2013年11月23日 0:57
    2013年11月23日 0:53
  • Both delete and insert will touch index and data pages.
    2013年11月23日 2:42
  • SQLSERVER给出的一些有用信息

    --牺牲者:victimProcess id="processd245288
    --等待资源 有索引 waitresource="KEY: 7:72057594592690176 (6630517ab975)
    --锁模式:lockMode="U"
    --锁超时:lockTimeout="4294967295"
    --当时执行的语句 <inputbuf> (@Name nvarchar(4000))delete from [a] where Uame=@Name    </inputbuf>
    --进程:spid="96"


    --非牺牲者:process id="processd2274c8"
    --等待资源 与牺牲者等待同一个资源 waitresource="KEY: 7:72057594592690176 (7f24bf9871b5)"
    --锁模式:lockMode="X"
    --进程:spid="136"
    --锁超时:lockTimeout="4294967295"
    --当时执行的sql语句:    <inputbuf> (@Time datetime,@ID int,@Gre int,@OerID int,@rID uniqueidentifier,@RUD nvarchar(4000),@Uame nvarchar(4000))INSERT INTO [a]([a],[CID],[rNe],[AddTime],[Gere],[RID],[OID]) VALUES(@ProduByUserID,@ClID,@Usame,@Adme,@Gee,@RD,@OID)    </inputbuf>


    --索引id:hobtid="72057594592690176"  associatedObjectId="72057594592690176"

     无论是聚集索引还是非聚集索引,想问一下LZ您建立索引时候的第一个字段是不是Usame字段

    如果是聚集索引

    插入记录的时候也需要用到索引的,因为需要按照索引字段的排序规则(升序/降序)去插入记录

    LZ可以参考一下:聚集索引表插入数据和删除数据的方式是怎样的

    如果是非聚集索引

    SQLSERVER中的假脱机 万圣节问题 的那个小节

    插入记录的时候需要将记录插入到非聚集索引页面,而插入记录到非聚集索引页面的时候也是要排序规则的(升序/降序)

    删除记录也是需要到非聚集索引页面查找记录,然后删除对应的记录

    不知道这样解释LZ明白不?

    2013年11月23日 3:41
  • 问题已经找打了
    2013年11月23日 4:13
  • 一般地,如果不是有特殊理由(比如日志表、数据仓库、staging表),最好不要用heap。

    想不想时已是想,不如不想都不想。

    2013年11月24日 3:23
    版主