死锁的奇怪的地方:死锁设计到的表示heap表,但是对key发生死锁,但是对key进行等待,死锁设计到的hotbid,无法再sys.partitions查询到objectid(这个误判是我们有索引的重建,导致hotbid变化,无法再表中查找到)
问题是出现在一个非聚集索引上,这个索引是key是uame,是走索引的,为什么和insert死锁呢
线索:表中delete的where 字段,参数化传进来使用的是nvarchar,但是表中却是使用varchar
死锁信息:
原因:
目前还没找到原因但是估计和nvarchar 和 varchar 的隐式类型转化有关
大概问题我已经发现了,虽然delete 是走索引的,但是在计划上发现GetRangeThroughConvert 对类型进行转化,转后后,出来3个计算标量,
然后再索引查找的时候对最小的,最大的标量进行 查找 就是 标量1<uame<标量3,这样导致delete 查找的范围扩大,导致和insert之间的锁请求冲突
其他资料:
资料包括:表结构,和delete 的执行计划,如果有兴趣研究在资料方面我会尽力,按需求补全
涉及到公司的一些表结构,不方便在公共场合透露,如果有朋友需要可以发我的邮箱索取,我的邮箱: [email protected]