select死锁问题

场景:
2个事务分别对2条数据加了S锁,然后都要更新对方的数据
1个事务做UPDATE操作,同时并发了一个非事务慢查询
场景1出现频率低,简单调整程序或业务规则可避免,在此不研究
场景2出现频率高,特别是存在大量慢查询的情况,以下给出原理及适用于SL的解决方案


原因分析:
select死锁问题
当select列没有被索引完全覆盖时,先对非聚集索引加S锁,然后需要通过聚集索引找到其他列,这时要申请聚集索引的S锁
update操作会先对聚集索引加X锁,在更新非聚集索引列后要重排索引,则要申请这个非聚集索引的X锁


解决方案:
在SELECT 中加WITH(NOLOCK)

NOLOCK 可能把没有提交事务的数据也显示出来
READPAST 会把被锁住的行不显示出来(不考虑)

做好并发控制及状态验证