鉴于以下情况: 从Sql Server Management Studio(2005,2008)执行select语句以检索大型结果集。通过从上下文菜单中选择“编辑前200行”,不完成此操作。
我们的DBA说这可能会锁定被查询的表。查询结果关闭时会发生解锁。
我找不到任何证实这是真的文件。 那么,事实还是虚构?
修改
选择Aaron的答案,并竖起Yuri和Lloyd的答案。
此致
米歇尔
答案 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语句。对表进行的任何更改都需要独占锁。表必须等待所有共享锁终止才能授予连接独占锁。因此,对表进行更改的事务必须等到表上的所有其他事务结束。