[20131122]奇怪的死锁

简介: 死锁的奇怪的地方:死锁设计到的表示heap表,但是对key发生死锁,但是对key进行等待,死锁设计到的hotbid,无法再sys.partitions查询到objectid(这个误判是我们有索引的重建,导致hotbid变化,无法再表中查找到) 问题是出现在一个非聚集索引上,这个索引是key是uam...

死锁的奇怪的地方:死锁设计到的表示heap表,但是对key发生死锁,但是对key进行等待,死锁设计到的hotbid,无法再sys.partitions查询到objectid(这个误判是我们有索引的重建,导致hotbid变化,无法再表中查找到)

问题是出现在一个非聚集索引上,这个索引是key是uame,是走索引的,为什么和insert死锁呢

线索:表中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> 

原因:

  目前还没找到原因但是估计和nvarchar 和 varchar 的隐式类型转化有关  

  大概问题我已经发现了,虽然delete 是走索引的,但是在计划上发现GetRangeThroughConvert 对类型进行转化,转后后,出来3个计算标量,

  然后再索引查找的时候对最小的,最大的标量进行 查找 就是 标量1<uame<标量3,这样导致delete 查找的范围扩大,导致和insert之间的锁请求冲突

其他资料:

  资料包括:表结构,和delete 的执行计划,如果有兴趣研究在资料方面我会尽力,按需求补全

  涉及到公司的一些表结构,不方便在公共场合透露,如果有朋友需要可以发我的邮箱索取,我的邮箱: fanzhouqi@gmail.com

目录
相关文章
|
6月前
|
Java
Java并发编程中的死锁问题及解决方法
【2月更文挑战第11天】 在Java并发编程中,死锁是一个常见但又非常棘手的问题。本文将深入探讨死锁的概念、产生原因以及常见的解决方法,帮助读者更好地理解并发编程中的挑战,并提供实用的解决方案。
92 6
|
安全
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
90 0
什么是死锁?(把死锁给大家讲明白,知道是什么,为什么用,怎么用)
|
Java
死锁不可怕
死锁不可怕
97 0
|
存储 关系型数据库 MySQL
面试官:解释下什么是死锁?为什么会发生死锁?怎么避免死锁?
开局先来个段子: 面试官: 解释下什么是死锁? 应聘者: 你录用我,我就告诉你 面试官: 你告诉我,我就录用你 应聘者: 你录用我,我就告诉你 面试官: 滚!
|
存储 安全 Java
看完你就明白的锁系列之锁的状态
前面两篇文章我介绍了一下 看完你就应该能明白的悲观锁和乐观锁 看完你就明白的锁系列之自旋锁 看完你就会知道,线程如果锁住了某个资源,致使其他线程无法访问的这种锁被称为悲观锁,相反,线程不锁住资源的锁被称为乐观锁,而自旋锁是基于 CAS 机制实现的,CAS又是乐观锁的一种实现,那么对于锁来说,多个线程同步访问某个资源的流程细节是否一样呢?换句话说,在多线程同步访问某个资源时,锁的状态会如何变化呢?本篇文章来探讨一下。
97 0
看完你就明白的锁系列之锁的状态
|
NoSQL Java Linux
咋办,死锁了
死锁的概念; 模拟死锁问题的产生; 利用工具排查死锁问题; 避免死锁问题的发生;
咋办,死锁了
|
Java 程序员
一个多线程死锁案例,如何避免及解决死锁问题?
多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧。
216 0
一个多线程死锁案例,如何避免及解决死锁问题?
|
Java
一个线程中断的Bug:明明中断了线程,却为何不起作用呢?
一个线程中断的Bug:当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedException异常。如果我们对InterruptedException异常处理不当,则会发生我们意想不到的后果!今天,我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用。
418 0
一个线程中断的Bug:明明中断了线程,却为何不起作用呢?
|
算法 调度 开发者
什么是死锁?如何解决死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
|
算法 调度
什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80372104 什么是死锁 死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
2464 0