“事故处理”的资源开销
while @j>0
Begin
begin try
begin tran
select top 1 @DANo=DANO,@DATime=DATime,@LogTime=LogTime,@MeterNo=MeterNo,@MeterType=MeterType,@Qty=Qty from #tmpjiaoxuenanloudata;
exec Usp_DAListForEnergyDataDetailsiping @DANo,@DATime,@LogTime,@MeterType,@MeterNo,@Qty;
update cems.dbo.sipingdata01 set lable=1 where DATime=@DATime and meterno=@meterno;
print '--------汇总成功----------'
print 'DATime='+convert(nvarchar(25),@DATime,120)
delete top(1) from #tmpjiaoxuenanloudata;
set @j=@j-1
end try
begin catch
rollback tran --处理失败 数据回滚
end catch
End
问题一:“事故处理”的资源开销是不是非常大,比单纯的“SQL”过程大多少???
问题二:“Usp_DAListForEnergyDataDetailsiping”中还包含其它“若干存储过程”,做了大量的数据处理。 如果不用事故,那么数据库服务器跑的很流畅。如果采用事故,那么数据库就会变得非常的缓慢,“事故处理”资源开销在这里非常的明显。 Why???
------解决方案--------------------开销应该比较大, 但必须用,否则你的数据不能保证正确,那你的系统还有什么存在的意义
------解决方案--------------------问题1:事务有显式和隐式两种,你不用,其实SQLServer还是会内部使用,开销会难免。但是更加安全,越大、越重要的系统,越要使用事务来维持一致性。你应该考虑如何去用,而不是怎么减少开销。
问题2:这个慢,很大程度是因为你的事务级别,如果把级别定义得太高,每个事务都只能串行,速度肯定慢。重点应该优化每个存储过程,然后把事务调整到适当的级别。
------解决方案--------------------因为它需要等待某些操作后才能执行,这样并行性会没有想象中好。
------解决方案--------------------你这几个问题.....我都不知道从哪个回复了。不显示commit 或者rollback,问题严重。很容易造成阻塞。至于开销,还是那句,把里面的优化会更加重要,2008 的话可以使用XACT_ABORT 来帮你在发生错误的时候自动回滚。可以从联机丛书上了解一下。
------解决方案--------------------下次麻烦引用一下,不然太多贴有时候就不知道你问问题了。
------解决方案--------------------不明白你的说的 “事故处理” 是try catch 还是transaction