我需要能够迭代所有表并发出TRUNCATE
命令,但是我不希望循环因阻塞而停止。本质上,我正在寻找最佳方法来确定SCH-M
在发出截断命令之前是否可以获得锁定。
Windows Server 2016 Datacenter 10.0 上的 Microsoft SQL Server 2019 (RTM-CU26) - 15.0.4365.2 (X64) 标准版(64 位)
我需要能够迭代所有表并发出TRUNCATE
命令,但是我不希望循环因阻塞而停止。本质上,我正在寻找最佳方法来确定SCH-M
在发出截断命令之前是否可以获得锁定。
Windows Server 2016 Datacenter 10.0 上的 Microsoft SQL Server 2019 (RTM-CU26) - 15.0.4365.2 (X64) 标准版(64 位)
测试是否可以获取锁的最佳方法是尝试获取它。
用于
LOCK_TIMEOUT
在等待指定时间后放弃,或者在遇到冲突锁时立即放弃(如您喜欢)。用于TRY...CATCH
处理任何错误并稍后重试。使用锁 DMV 是不可靠的,因为它是内部锁结构的非事务视图。冲突的锁很容易出现在扫描后面。无论如何,完成测试和尝试获取之间存在延迟
Sch-M
。最好尽可能避免扫描 DMV 锁,以免干扰通常已经高度竞争的内部设施。
理论上你可以检查
sys.dm_tran_locks
是否存在现有锁,否则等待并再次循环。但正如其他人所指出的,这种方法并不可靠,因为无法保证在检查和实际截断之间不会有人抢先执行。这还会给锁管理器带来额外的压力。
如果您有一个与此相同的表,那么您可以使用
ALTER TABLE SWITCH
和WAIT_AT_LOW_PRIORITY
选项快速将表切换到另一个表,然后截断该表。请注意,此选项不需要上述循环。假设这与您之前关于分区表的问题有关,您可以这样做