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