在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
的情况发生-但它将使其他交易也在同一时间批量加载(但它不允许别的).
如果ALTER TABLE
在事务中发出命令,SQL Server将获取SCH-M
(模式修改)锁定 - 即使SELECT
使用WITH (NOLOCK)
查询提示的语句也不兼容.
没有可以使用的解决方法或技巧或其他查询提示,没有解决方法 - 你只需要知道这一点并尊重它.SCH-M
一旦与ALTER TABLE
语句的事务已提交(或回滚),将释放.
有关详细讨论,请参阅有关锁定模式的TechNet文档 - 还有其他情况(除此之外ALTER TABLE
)SCH-M
获取锁定时(例如,当表被截断时).
该BU
锁(大容量更新锁),还可以防止SELECT
的情况发生-但它将使其他交易也在同一时间批量加载(但它不允许别的).