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

时间:2019-07-17 09:22:36

标签: sql transactions truncate 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```

1 个答案:

答案 0 :(得分:0)

您陷入僵局,因为WITH(NOLOCK)等同于使用READ UNCOMMITTED READUNCOMMITTED 指定允许脏读。没有发出共享锁来防止其他事务修改当前事务读取的数据,并且其他事务设置的互斥锁不会阻止当前事务读取锁定的数据。允许脏读可能导致更高的并发性,但代价是读取数据修改,然后其他事务将其回滚。这可能会为您的交易产生错误,向用户显示从未提交的数据,或者使用户两次(或根本看不到)看到记录。

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