在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
答案 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
发生 - 但是它会允许其他交易同时批量加载(但它不允许任何内容)其他人)。