Sql 在重新加载表时阻塞表

Sql 在重新加载表时阻塞表,sql,sql-server-2012,Sql,Sql Server 2012,在我们的数据仓库中,我们有一个每小时被截断/重新加载的表。这个过程通常需要几秒钟 我们最近发现,一些挂接它们的报告显示为空白,并且发现加载此表的任务花费了10分钟而不是几秒钟(我已经解决了另一个问题) 我们要做的是在发生截断/重新加载时锁定此表。我们如何做到这一点,以便在任务完成之前阻止查看此表的任何查询?我们是否简单地围绕它包装一个事务 编辑:我已经测试了这个,它似乎做了我想要的。这样做对吗 BEGIN TRANSACTION BEGIN TRY TRUNCATE TABLE dbo.Ma

在我们的数据仓库中,我们有一个每小时被截断/重新加载的表。这个过程通常需要几秒钟

我们最近发现,一些挂接它们的报告显示为空白,并且发现加载此表的任务花费了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;

使用
TRANSACTION
将确保事务的原子性,即,根据您的示例,将有一套完整的insert或根本没有insert。但是,表未被锁定,或者在执行任务时不会有任何阻塞。@ydoow那么,如何确保访问此表的任何查询不会得到空白表?我认为使用事务,除非发布会话使用类似于
read uncommitted
,否则它们将在事务开始之前(即包含数据的表)或事务提交之后获得结果。。但两者之间什么都没有?@ydoow-我想我们说的是同一件事。但是,您说该表未被锁定或阻止。我尝试在一个单独的会话中访问数据,同时表被截断,并得到一个阻塞的会话,直到我提交或回滚我想要的事务。隔离级别的适当设置可能会满足您的要求。使用
TRANSACTION
将确保事务的原子性,即,根据您的示例,将有一套完整的insert或根本没有insert。但是,表未被锁定,或者在执行任务时不会有任何阻塞。@ydoow那么,如何确保访问此表的任何查询不会得到空白表?我认为使用事务,除非发布会话使用类似于
read uncommitted
,否则它们将在事务开始之前(即包含数据的表)或事务提交之后获得结果。。但两者之间什么都没有?@ydoow-我想我们说的是同一件事。但是,您说该表未被锁定或阻止。我尝试在一个单独的会话中访问数据,同时表被截断,并得到一个阻塞的会话,直到我提交或回滚我想要的事务。隔离级别的适当设置可能会满足您的要求。