转移的僵局,用于选择查询

问题描述 投票:0回答:2
cascescation,我对存储过程有以下错误,这只是一个选择的查询:

Transaction (Process ID 91) was deadlocked on lock



我最初的理解是,选择查询不会锁定表,也不会造成死锁也是

如果我设置了隔离级别以读取未解决查询的读数,那会解决问题吗?

我的启动理解是选择 查询不会锁定桌子,也不会 导致僵局
sql t-sql concurrency deadlock
2个回答
62
投票
这种理解是错误的。精选查询在他们分析的行上取共享锁。共享锁可能会冲突来自Update/DELETE/INSERT语句的独家锁。两个选择的语句不会僵局,但是在更新中选择了可以僵局的僵局。当发生这种僵局时,选择通常是受害者,因为它没有执行任何更新,因此总是会丢失抽签。
在任何僵局中,您需要发布所涉及的表格的确切模式,确切的T-SQL语句和僵局图。请参阅:如何保存僵局图(SQL Server Profiler)

。有了这些信息,您可以收到指导如何解决僵局。

像Remus说,您正在陷入僵局,因为选择和更新(或其他)操作相互僵局,而不是选择VS选择。您将必须查看所有触摸该表的查询,并为这些查询创建适当的覆盖索引,这将解决您的问题。良好的覆盖索引是首选的解决方案,而不是与(Nolock)表提示使用。

请参阅以下

link,以获取有关如何创建覆盖索引及其如何影响僵局的良好教程。


8
投票
link

。 当阅读未投入或使用(nolock)时,必须意识到查询重新传输的数据可能不是真实的!

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.