应用NOLOCK后,Select语句也会等待

  发布于 2023-02-13 09:35

在SQL Server 2012中,我显式锁定了一个表,如下所示:

参考:如何在Microsoft SQL Server中显式锁定表(寻找黑客 - 不合作的客户端)

当这个锁发生时,我正在该表上运行带有NOLOCK的SELECT查询.但是查询不是在撤回数据,直到我停止Window 1并等待一段时间.

为什么没有NOLOCK按预期工作?

- 窗口1

DECLARE @TranName VARCHAR(300)
SET @TranName = 'MyTran';

BEGIN TRANSACTION @TranName


DECLARE @Current INT
SET @Current = 0

DECLARE @LoopCount INT
SET @LoopCount = 1;

WHILE @Current < 1
BEGIN

       SET @LoopCount = @LoopCount+1;
       PRINT @LoopCount

       ALTER TABLE DBATCPH ADD LockTest INT
       ALTER TABLE DBATCPH DROP COLUMN LockTest 

       WAITFOR DELAY '00:01';



END

GO 

Go

- 窗口2

   SELECT TOP 1 * FROM DBATCPH NOLOCK

marc_s.. 5

如果ALTER TABLE在事务中发出命令,SQL Server将获取SCH-M(模式修改)锁定 - 即使SELECT使用WITH (NOLOCK)查询提示的语句也不兼容.

没有可以使用的解决方法或技巧或其他查询提示,没有解决方法 - 你只需要知道这一点并尊重它.SCH-M一旦与ALTER TABLE语句的事务已提交(或回滚),将释放.

有关详细讨论,请参阅有关锁定模式的TechNet文档 - 还有其他情况(除此之外ALTER TABLE)SCH-M获取锁定时(例如,当表被截断时).

BU锁(大容量更新锁),还可以防止SELECT的情况发生-但它将使其他交易也在同一时间批量加载(但它不允许别的).

1 个回答
  • 如果ALTER TABLE在事务中发出命令,SQL Server将获取SCH-M(模式修改)锁定 - 即使SELECT使用WITH (NOLOCK)查询提示的语句也不兼容.

    没有可以使用的解决方法或技巧或其他查询提示,没有解决方法 - 你只需要知道这一点并尊重它.SCH-M一旦与ALTER TABLE语句的事务已提交(或回滚),将释放.

    有关详细讨论,请参阅有关锁定模式的TechNet文档 - 还有其他情况(除此之外ALTER TABLE)SCH-M获取锁定时(例如,当表被截断时).

    BU锁(大容量更新锁),还可以防止SELECT的情况发生-但它将使其他交易也在同一时间批量加载(但它不允许别的).

    2023-02-13 09:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有