Sql 简单选择不返回所有行和不返回块的sp_
我在一个只有少量行的表上运行一个简单的select,它将永远运行下去。我发现,如果我运行以下命令,则返回的结果很好:Sql 简单选择不返回所有行和不返回块的sp_,sql,sql-server,transactions,nolock,Sql,Sql Server,Transactions,Nolock,我在一个只有少量行的表上运行一个简单的select,它将永远运行下去。我发现,如果我运行以下命令,则返回的结果很好: SELECT TOP 23 * FROM MyTable ORDER BY 1 SELECT TOP 24 * FROM MyTable ORDER BY 1 但是,如果我跑步,它将永远挂起: SELECT TOP 23 * FROM MyTable ORDER BY 1 SELECT TOP 24 * FROM MyTable ORDER BY 1 如果我运行sp_wh
SELECT TOP 23 * FROM MyTable ORDER BY 1
SELECT TOP 24 * FROM MyTable ORDER BY 1
但是,如果我跑步,它将永远挂起:
SELECT TOP 23 * FROM MyTable ORDER BY 1
SELECT TOP 24 * FROM MyTable ORDER BY 1
如果我运行
sp_who
或sp_who2
,则没有人阻塞。为什么会发生这种情况,我如何修复它?如果在启用nolock
的情况下运行(忽略未提交的事务),您应该能够选择所有行:
SELECT * FROM MyTable WITH (NOLOCK)
某个地方有一个事务尚未提交或回滚(我不知道为什么它没有显示在sp\u who
)。您可以运行以下命令强制回滚所有事务,然后选择“应该可以正常工作,而无需nolock
”:
USE master
ALTER DATABASE DbName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE DbName SET MULTI_USER
这两个查询的性能应该基本相同。@GordonLinoff问题是一个打开的事务插入了第24行。使用
nolock
运行返回了有问题的行。