1

我正在使用分区切换来重建临时表上的索引,而不像微软的文章中那样将它们放在分区表上。

我有什么归结为

BEGIN TRAN
ALTER INDEX IX_Working ON dbo.WorkingTable DISABLE

INSERT INTO dbo.WorkingTable ( Id, PartitionColumn, Values...)
SELECT Id, PartitionColumn, Values...
FROM PartitionedTable WITH (HOLDLOCK)
WHERE PartitionColumn <= @rightboundary
AND PartitionColumn > @leftboundary

INSERT INTO WorkingTable ( Id, PartitionColumn, Values...)
SELECT Id, PartitionColumn, Values...
FROM Imports

ALTER INDEX IX_Working ON WorkingTable REBUILD -- SLOW BIT

ALTER TABLE PartitionedTable SWITCH PARTITION @partition TO SwapTable
ALTER TABLE WorkingTable SWITCH TO PartitionedTable PARTITION @partition

TRUNCATE TABLE SwapTable
COMMIT

现在,在此操作期间,我需要阻止对正在重新索引的分区的任何更新,但仍允许它们在其他分区上进行。PartionedTable 已将锁升级设置为自动。我正在尝试使用 HOLDLOCK 执行此操作,但我仍然能够在慢速期间从另一个连接执行 INSERT INTO PartionedTable (Id, @somevalueInTheRange, Values...)。

如何在仍然允许选择的同时阻止它?

4

1 回答 1

0

您可以尝试将 TABLOCKX 与 HOLDLOCK 一起使用吗?当前选择将放置一个由于 HOLDLOCK 而未释放的共享锁。但是共享锁不会阻止插入。

于 2012-11-07T21:19:44.070 回答