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)
我想在插入时锁定这个表,所以如果有人试图选择一个他们在截断后不会收到的记录.我正在使用的锁似乎锁定视图而不是表.
有没有更好的方法来解决这个问题?
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)
正确的锁定提示确实会影响源视图。
要使其插入时没人能从表中读取内容,请执行以下操作:
insert into LargeTable with (tablockx)
...
Run Code Online (Sandbox Code Playgroud)
在插入完成之前,无需执行任何操作即可使表看起来为空。插入始终在事务中运行,除非明确指定with (nolock)或,否则其他任何进程都无法读取未提交的行set transaction isolation level read uncommitted。据我所知,没有办法保护自己。
| 归档时间: |
|
| 查看次数: |
22449 次 |
| 最近记录: |