请教个问题,现在一个程序向一个表a中更新信息(需要先清空表,后批量插入,大概需要10秒钟),而另外的程序需要从表a查询信息,请问如何避免后一个程序在查询时,表a不会刚好是清空的状态。
我是用的这种方法来更新表
truncate table 表a
select * into 表a from xxx
我不想再正执行这个过程中时,会有另外的进程b来查询数据库,另外的程序b是别人的程序,我无法控制读取的时间。
------解决方案--------------------
你可以加事务嘛,比如
begin tran
truncate table 表a
insert into 表a(列名)
select 列名 from xxx with (tablock)
end --或者加入适当的错误处理
------解决方案--------------------
默认级别下,增删改操作都会加锁,而查询会加S锁,直到查完就释放,某些级别下即使是查询也会持续到事务结束而不仅仅是查询完毕才释放。另外我这里:
select 列名 from xxx with (tablock) 实际上就是加了锁,把表锁住然后进行insert,在堆表情况下,with (tablock)能加快速度,降低锁表的时间