在我们的数据仓库中,我们有一个每小时被截断/重新加载的表。这个过程通常需要几秒钟。
我们最近发现一些挂掉它们的报告是空白的,并且发现加载此表的任务需要10分钟而不是几秒钟(我已修复的单独问题)。
我们想要做的是在发生截断/重载时锁定此表。我们如何才能这样做,以便在任务完成之前阻止查看此表的任何查询?我们只是简单地围绕它进行交易吗?
编辑:我已经测试了这个,它似乎做了我想要的。这是解决问题的正确方法吗?BEGIN TRANSACTION
BEGIN TRY
TRUNCATE TABLE dbo.MatProduct
INSERT INTO dbo.MatProduct (
...
)
END TRY
BEGIN CATCH
--Rethrow the error
DECLARE
@ErrorMessage NVARCHAR(4000),
@ErrorSeverity INT,
@ErrorState INT
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE()
RAISERROR (
@ErrorMessage,
@ErrorSeverity,
@ErrorState
)
--Rollback the transaction if an error occurred
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH
--Commit the transaction if there were no errors
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;