Sql 在重新加载表时阻塞表
在我们的数据仓库中,我们有一个每小时被截断/重新加载的表。这个过程通常需要几秒钟 我们最近发现,一些挂接它们的报告显示为空白,并且发现加载此表的任务花费了10分钟而不是几秒钟(我已经解决了另一个问题) 我们要做的是在发生截断/重新加载时锁定此表。我们如何做到这一点,以便在任务完成之前阻止查看此表的任何查询?我们是否简单地围绕它包装一个事务 编辑:我已经测试了这个,它似乎做了我想要的。这样做对吗Sql 在重新加载表时阻塞表,sql,sql-server-2012,Sql,Sql Server 2012,在我们的数据仓库中,我们有一个每小时被截断/重新加载的表。这个过程通常需要几秒钟 我们最近发现,一些挂接它们的报告显示为空白,并且发现加载此表的任务花费了10分钟而不是几秒钟(我已经解决了另一个问题) 我们要做的是在发生截断/重新加载时锁定此表。我们如何做到这一点,以便在任务完成之前阻止查看此表的任何查询?我们是否简单地围绕它包装一个事务 编辑:我已经测试了这个,它似乎做了我想要的。这样做对吗 BEGIN TRANSACTION BEGIN TRY TRUNCATE TABLE dbo.Ma
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;
使用
TRANSACTION
将确保事务的原子性,即,根据您的示例,将有一套完整的insert或根本没有insert。但是,表未被锁定,或者在执行任务时不会有任何阻塞。@ydoow那么,如何确保访问此表的任何查询不会得到空白表?我认为使用事务,除非发布会话使用类似于read uncommitted
,否则它们将在事务开始之前(即包含数据的表)或事务提交之后获得结果。。但两者之间什么都没有?@ydoow-我想我们说的是同一件事。但是,您说该表未被锁定或阻止。我尝试在一个单独的会话中访问数据,同时表被截断,并得到一个阻塞的会话,直到我提交或回滚我想要的事务。隔离级别的适当设置可能会满足您的要求。使用TRANSACTION
将确保事务的原子性,即,根据您的示例,将有一套完整的insert或根本没有insert。但是,表未被锁定,或者在执行任务时不会有任何阻塞。@ydoow那么,如何确保访问此表的任何查询不会得到空白表?我认为使用事务,除非发布会话使用类似于read uncommitted
,否则它们将在事务开始之前(即包含数据的表)或事务提交之后获得结果。。但两者之间什么都没有?@ydoow-我想我们说的是同一件事。但是,您说该表未被锁定或阻止。我尝试在一个单独的会话中访问数据,同时表被截断,并得到一个阻塞的会话,直到我提交或回滚我想要的事务。隔离级别的适当设置可能会满足您的要求。