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

时间:2013-12-03 21:26:13

标签: sql-server

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

参考:How to explicitly lock a table in Microsoft SQL Server (looking for a hack - uncooperative client)

发生此锁定时,我正在该表上运行带有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

1 个答案:

答案 0 :(得分:5)

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

没有可以使用的解决方法或技巧或其他查询提示,没有解决方法 - 您只需要了解并尊重它。一旦提交(或回滚)SCH-M语句的事务,ALTER TABLE将被释放。

See the TechNet docs on Lock Modes进行详细讨论 - 获取ALTER TABLE锁时(例如,当表被截断时)还有其他情况(SCH-M除外)。

BU锁定(批量更新锁定)也可以阻止SELECT发生 - 但是它会允许其他交易同时批量加载(但它不允许任何内容)其他人)。