Sql Server Management Studio:由于select语句而锁定了表

时间:2012-09-06 12:05:33

标签: sql-server locking ssms sql

鉴于以下情况: 从Sql Server Management Studio(2005,2008)执行select语句以检索大型结果集。通过从上下文菜单中选择“编辑前200行”,完成此操作。

我们的DBA说这可能会锁定被查询的表。查询结果关闭时会发生解锁。

我找不到任何证实这是真的文件。 那么,事实还是虚构?

修改
选择Aaron的答案,并竖起Yuri和Lloyd的答案。

此致

米歇尔

3 个答案:

答案 0 :(得分:2)

尝试阅读这篇文章。 Lock Modes

共享锁


共享(S)锁允许并发事务在悲观并发控制下读取(SELECT)资源。有关更多信息,请参阅并发控制类型。当资源上存在共享(S)锁时,没有其他事务可以修改数据。一旦读取操作完成,就会释放资源上的共享(S)锁,除非将事务隔离级别设置为可重复读取或更高,或者使用锁定提示在持续时间内保留共享(S)锁定。事务。

答案 1 :(得分:2)

SELECT运行一次,一旦数据完成读取,就会释放共享锁(非独占锁!)。这可能恰好与客户端上显示的最后一行重合,但可能在几毫秒之前发生。 SQL Server不知道结果在客户端上打开的事实(除非我们讨论的是“打开表”/“编辑前200行”)。我不认为使用单个SELECT语句以您描述的方式锁定表是可能的 - 其他读者和编写者应该能够在表上运行得很好,尽管可能存在一些争用(不是排他锁定)你的SELECT正在运行时。

然而,你可以模拟这种方法的方法是做一些......

的组合
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM dbo.table WITH (TABLOCKX);

......然后去吃午饭。

答案 2 :(得分:2)

您的SELECT语句将锁定表,以便在语句运行时无法对表进行更改。它不会将表与其他SELECT语句锁定。

SELECT语句使用共享锁操作。共享锁与其他共享锁兼容。因此,您可以针对同一个表运行多个SELECT语句。对表进行的任何更改都需要独占锁。表必须等待所有共享锁终止才能授予连接独占锁。因此,对表进行更改的事务必须等到表上的所有其他事务结束。