当我在一个存储过程中调用ALTER TABLE REBUILD并尝试同时在另一个存储过程中调用数据时发生错误。
CREATE PROCEDURE IF NOT EXISTS RebuildContent()
AS
BEGIN
INSERT INTO dbo.Log (Date, Message)
VALUES ( DateTime.UtcNow, "Starting Content table rebuilding ..." );
ALTER TABLE dbo.Content REBUILD;
ALTER TABLE dbo.ContentCrc REBUILD;
INSERT INTO dbo.Log (Date, Message)
VALUES ( DateTime.UtcNow, "Completed Content table rebuilding ..." );
END;
有没有解决方法可以避免它? 提前谢谢!
答案 0 :(得分:3)
您正在重建和从同一张桌子阅读之间遇到竞争条件。
重建表会通过压缩插入创建的文件来创建新文件。不幸的是,现在,一旦重建正在删除旧文件,您将无法访问旧版本,并且您将收到错误消息。
我们知道这个问题,并创建了一个工作项来保留对已启动查询的旧文件的访问权限(提供快照语义)。但是,我目前没有ETA。
因此,在此之前,请安排重建和阅读作业,不要重叠。
注意:您仍然可以同时重建和插入或插入和读取。