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