在事务中使用"with nolock"或删除表时



我正在尝试清理临时表。 最快的方法是删除或截断表,然后回滚并仅包含所需的行。 现在我的问题是数据库的"死锁"。有没有办法使用"with nolock"让数据库不锁定

BEGIN TRANSACTION;
drop table audit.Testing with (nolock) ;
rollback transaction
SELECT *
from
(select *
,rn = ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id DESC)
FROM audit.testing with (nolock)
) a
where rn =1
order by Id, SysEndTime desc```

您处于死锁状态,因为 WITH (NOLOCK) 等效于使用 READ UNCOMMIT READUNCOMMIT 指定允许脏读。不发出共享锁以防止其他事务修改当前事务读取的数据,并且其他事务设置的独占锁不会阻止当前事务读取锁定的数据。允许脏读可能会导致更高的并发性,但代价是读取数据修改,然后由其他事务回滚。这可能会为您的事务生成错误,向用户显示从未提交过的数据,或导致用户查看记录两次(或根本不查看)。

READUNCOMMIT 和 NOLOCK 提示仅适用于数据锁。所有查询(包括具有 READUNCOMMIT 和 NOLOCK 提示的查询)都会在编译和执行期间获取 Sch-S(模式稳定性)锁。因此,当并发事务在表上持有 Sch-M(模式修改)锁时,查询将被阻止。例如,数据定义语言 (DDL) 操作在修改表的架构信息之前获取 Sch-M 锁。任何并发查询(包括使用 READUNCOMMIT 或 NOLOCK 提示运行的查询)在尝试获取 Sch-S 锁时都会被阻止。相反,持有 Sch-S 锁的查询会阻止尝试获取 Sch-M 锁的并发事务 微软文档

最新更新