最近一个消息发送功能在测试的过程中遇到了因为非聚集索引引发的死锁问题,下面是小伙伴事后总结的内容,现分享出来。
(因为一些内容涉及到公司信息,所以只分享了其中部分内容,但是应该不影响整体阅读)
情景介绍
表名是Receiver,字段有id(主键,聚集索引),msgId(非聚集索引),receiver(非聚集索引),createTime,updateTime
并发执行的语句为
1、insert into Receiver select msgId,receiver,createTime,updateTime from tempTable
2、update Receiver set updateTime=#{} where msgId=#{} and receiver in (#{})
发生场景
1、多线程(100个)执行Receiver的插入语句
2、多线程(8线程)执行Receiver的更新语句
锁分析
1、insert语句执行时,优先申请插入记录所在的行(或页、表)的X锁

本文介绍了在SQL Server环境下,由于非聚集索引引起的死锁问题。并发执行的插入和更新操作导致死锁,具体表现为插入操作在完成索引更新时与更新操作的索引锁冲突。解决办法包括使用行级锁和在更新语句中添加with(nolock)以降低死锁风险。
最低0.47元/天 解锁文章
956





