插入时锁定表

JBo*_*one 8 sql t-sql sql-server locking

我有一个从视图中填充的大表.这样做是因为视图需要很长时间才能运行,并且更容易在表中提供数据.每隔一段时间运行一个过程以更新表.

 TRUNCATE TABLE LargeTable

 INSERT INTO LargeTable
 SELECT * 
 FROM viewLargeView
 WITH (HOLDLOCK)
Run Code Online (Sandbox Code Playgroud)

我想在插入时锁定这个表,所以如果有人试图选择一个他们在截断后不会收到的记录.我正在使用的锁似乎锁定视图而不是表.

有没有更好的方法来解决这个问题?

Dar*_*ren 6

BEGIN TRY
 BEGIN TRANSACTION t_Transaction

 TRUNCATE TABLE LargeTable

 INSERT INTO LargeTable
 SELECT * 
 FROM viewLargeView
  WITH (HOLDLOCK)

 COMMIT TRANSACTION t_Transaction
END TRY 
BEGIN CATCH
  ROLLBACK TRANSACTION t_Transaction
END CATCH
Run Code Online (Sandbox Code Playgroud)

  • @Emo,仅适用于:“在 Azure SQL 数据仓库和并行数据仓库中,TRUNCATE TABLE 不能在事务内运行。” (2认同)

And*_*mar 6

正确的锁定提示确实会影响源视图。

要使其插入时没人能从表中读取内容,请执行以下操作:

insert into LargeTable with (tablockx)
...
Run Code Online (Sandbox Code Playgroud)

在插入完成之前,无需执行任何操作即可使表看起来为空。插入始终在事务中运行,除非明确指定with (nolock)或,否则其他任何进程都无法读取未提交的行set transaction isolation level read uncommitted。据我所知,没有办法保护自己。