有时候,我在一个只包含Select查询的存储过程中遇到以下错误:事务 (进程 ID 91) 在锁定时发生死锁
我的初步理解是,Select查询不会锁定表,或者即使它试图查询的表正在被另一个进程更新/锁定,也不会导致死锁。但现在看来,Select查询也可能会导致死锁。
如果我将查询的隔离级别设置为读取未提交,这样是否能解决问题?
有时候,我在一个只包含Select查询的存储过程中遇到以下错误:事务 (进程 ID 91) 在锁定时发生死锁
我的初步理解是,Select查询不会锁定表,或者即使它试图查询的表正在被另一个进程更新/锁定,也不会导致死锁。但现在看来,Select查询也可能会导致死锁。
如果我将查询的隔离级别设置为读取未提交,这样是否能解决问题?
就像Remus所说的那样,你会遇到死锁问题,是因为SELECT和UPDATE(或其他)操作相互死锁,而不是SELECT与SELECT相互死锁。你需要查看所有涉及该表的查询,并为这些查询创建适当的覆盖索引,这将解决你的问题。良好的覆盖索引是首选方案,而不是使用WITH(NOLOCK)表提示。
参见下面的链接,了解如何创建覆盖索引以及它如何影响死锁。