1

给定以下场景:从 Sql Server Management Studio (2005, 2008) 执行 select 语句以检索大型结果集。这不是通过从上下文菜单中选择“编辑前 200 行”来完成的。

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

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

编辑:
选择 Aaron 的答案,并为 Yuri 和 Lloyd 点赞以获得有用的答案。

问候,

米歇尔

4

3 回答 3

2

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

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

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

……然后去吃午饭。

于 2012-09-06T12:43:03.160 回答
2

尝试阅读这篇文章。锁定模式

共享锁


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

于 2012-09-06T12:18:15.663 回答
2

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

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

于 2012-09-06T13:27:14.630 回答