为什么这个SELECT语句会锁定SQL Server?

时间:2009-11-18 13:59:09

标签: sql-server-2005 locking

我有一个像这样的简单查询

SELECT * FROM MY_TABLE;

当我运行它时,SQL Server Management Studio挂起。

其他表和视图工作正常。

这会导致什么?我以前在运行UPDATE语句时有锁,我知道如何处理这些。但是什么可能导致SELECT锁定?

我已经运行了“所有阻止交易”报告,并且说没有。

5 个答案:

答案 0 :(得分:10)

可能不是锁定的选择,而是正在编辑(udpate / delete / insert)导致锁定的表的其他进程。

您可以通过在SQL Server上运行exec sp_who2来查看阻止的进程。

或者,如果您对脏读操作没问题,则可以执行以下两项操作之一

SELECT * FROM Table WITH (NOLOCK)

OR

SET Transaction Isolation Level Read Uncommitted
SELECT * FROM Table 

答案 1 :(得分:3)

使用此:

SELECT * FROM MY_TABLE with (NOLOCK)

答案 2 :(得分:3)

如果还有很多其他活动正在进行,其他可能会导致锁定,而您的SELECT可能是死锁的受害者。如果你运行以下

SELECT * FROM my_table WITH(nolock)

您告诉数据库您可以读取脏(未注释)数据,并且可以安全地忽略由其他活动引起的锁定。

此外,如果这样的查询导致管理工作室挂起,那么您的表可能会使用某些优化

答案 3 :(得分:1)

两种可能性:

  1. 它是一张非常庞大的桌子,你正试图返回500米的行。
  2. 某些其他进程锁定了表,阻止您的选择通过,直到该锁被释放。

答案 4 :(得分:1)

MY_TABLE也可能被一些未提交的事务锁定 - 即在另一个MSMM窗口中运行(或运行时失败)的脚本/存储过程。