SQL Server - 强制分区上的共享锁

时间:2012-10-24 16:30:39

标签: sql-server locking partitioning

我正在使用分区切换来重建临时表上的索引,而不像microsoft's article那样将它们放在分区表上。

我有什么归结为

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的锁升级设置为auto。我试图用HOLDLOCK做这个,但我仍然能够在慢速位期间从另一个连接执行INSERT INTO PartionedTable(Id,@ somevalueInTheRange,Values ...)。

如何在仍允许选择的情况下阻止此操作?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用TABLOCKX和HOLDLOCK吗?目前,选择将放置由于HOLDLOCK而未释放的SHARED锁。但是SHARED锁不会阻止插入。