我有一个从视图填充的大表。这样做是因为视图需要很长时间才能运行,并且更容易在表中提供可用的数据。每隔一段时间就会运行一个过程来更新表。
TRUNCATE TABLE LargeTable
INSERT INTO LargeTable
SELECT *
FROM viewLargeView
WITH (HOLDLOCK)
我想在插入时锁定该表,这样如果有人尝试选择一条记录,他们在截断后将不会收到任何记录。我使用的锁似乎锁定了视图而不是表。
有没有更好的方法来解决这个问题?
确实,正确的锁定提示会影响源视图。
为了使您在插入时没有人可以读取表中的内容,请执行以下操作:
insert into LargeTable with (tablockx)
...
在插入完成之前,您无需执行任何操作即可使表看起来为空。插入总是在事务中运行,并且没有其他进程可以读取未提交的行,除非它们明确指定with (nolock)
or set transaction isolation level read uncommitted
。据我所知,没有办法避免这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)