none
“事故处理”的资源开销 RRS feed

  • 问题

  • 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???

    Science and technology is my lover.

    2012年12月22日 8:24

答案

  • 不是什么都需要使用事务,一般使用SQLSERVER的默认事务隔离级别就可以了,就是每执行一句就自动提交事务

    像我们的报表sql语句也没有使用事务的

    ALTER PROCEDURE [dbo].[CT_GroupStatisticByOiltype_SearchMonthGatherRpt]
    (
    	@Year int,
    	@Month int,
    	@GroupStationNO VARCHAR(50)
    )
    AS
    BEGIN
    	DECLARE @STRSQL VARCHAR(4000)
    	SET @STRSQL='SELECT 
    		I_GSBO_StationNo, 
    		C_GSBO_Name, 
    		C_GSBO_OilType,
    		SUM(DE_GSBO_EVolume) AS DE_GSBO_EVolume, 
    		SUM(DE_GSBO_EAmount) AS DE_GSBO_EAmount, 
    		SUM(DE_GSBO_CCVolume) AS DE_GSBO_CCVolume,
    		SUM(DE_GSBO_CCAmount) AS DE_GSBO_CCAmount, 
    		SUM(DE_GSBO_CTVolume) AS DE_GSBO_CTVolume, 
    		SUM(DE_GSBO_CTAmount) AS DE_GSBO_CTAmount,
    		SUM(DE_GSBO_VolumeTotals) AS DE_GSBO_VolumeTotals,
    		SUM(DE_GSBO_AmountTotals) AS DE_GSBO_AmountTotals
    	FROM 
    		CT_GroupStatisticByOiltype 
    	WHERE 
    		year(D_GSBO_GroupDate)='+CAST(@Year AS VARCHAR(10))+' AND
    		MONTH(D_GSBO_GroupDate) ='+CAST(@Month AS VARCHAR(10))+' '
    	IF(@GroupStationNO<>'')
    	BEGIN
    		SET @STRSQL= @STRSQL + ' AND I_GSBO_StationNo in('+@GroupStationNO+')'
    	END
    	SET @STRSQL= @STRSQL + ' GROUP BY 
    		I_GSBO_StationNo, C_GSBO_Name, C_GSBO_OilType 
    	Order by C_GSBO_OilType ASC'
    	EXECUTE(@STRSQL)
    END

    不一定使用在汇总过程中,比如说一张订单表 和一张订单明细表 当你增加一个订单的时候 要同时插入两个表,这时候可以使用事务,要么同时插入成功,要么同时插入不成功

    LZ还是先理解一下事务的概念还有事务使用的地方 ,只是知识网上很多资料的,也可以查MSDN


    给我写信: QQ我:点击这里给我发消息


    2012年12月24日 8:06

全部回复

  • 问题一: LZ所指的资源开销应该是阻塞吧

    当你打开一个事务的时候,那么其他事务要访问你这个事务里所处理的资源时 比如访问表数据, 那么其他事务就要等待

    等你提交事务之后其他事务里的语句才能访问你的那个已经提交事务里的处理的资源 

    还有其实事务可以访问你的事务里的处理资源的范围取决于你的事务隔离级别

    具体的LZ可以看一下MSDN,这些概念不是一两句话可以解释清楚的

    问题二:如果不用事故,那么数据库服务器跑的很流畅。如果采用事故,那么数据库就会变得非常的缓慢,“事故处理”资源开销在这里非常的明显。

    你说的资源开销应该就是阻塞,其实事务要等待你的事务提交才能访问资源

    MSDN:

    事务控制

    http://msdn.microsoft.com/zh-cn/library/ms978457.aspx

    事务(数据库引擎)

    http://msdn.microsoft.com/zh-cn/library/ms190612(v=SQL.105).aspx

    事务和并发

    http://msdn.microsoft.com/zh-cn/library/777e5ebh.aspx

    控制事务(数据库引擎)

    http://msdn.microsoft.com/zh-cn/library/ms175523(v=SQL.105).aspx

    了解隔离级别

    http://msdn.microsoft.com/zh-cn/library/ms378149.aspx

    隔离级别

    http://msdn.microsoft.com/zh-cn/library/ms172001(v=sql.100).aspx


    给我写信: QQ我:点击这里给我发消息


    2012年12月23日 3:30
  • 谢谢大师,“事务处理会造成锁表等待”,对吧???        “什么隔离级别”只会锁定对应的“表中记录”的更新。

    事故应该尽量简短的使用在汇总过程中,对吧?


    Science and technology is my lover.

    2012年12月24日 2:30
  • 不是什么都需要使用事务,一般使用SQLSERVER的默认事务隔离级别就可以了,就是每执行一句就自动提交事务

    像我们的报表sql语句也没有使用事务的

    ALTER PROCEDURE [dbo].[CT_GroupStatisticByOiltype_SearchMonthGatherRpt]
    (
    	@Year int,
    	@Month int,
    	@GroupStationNO VARCHAR(50)
    )
    AS
    BEGIN
    	DECLARE @STRSQL VARCHAR(4000)
    	SET @STRSQL='SELECT 
    		I_GSBO_StationNo, 
    		C_GSBO_Name, 
    		C_GSBO_OilType,
    		SUM(DE_GSBO_EVolume) AS DE_GSBO_EVolume, 
    		SUM(DE_GSBO_EAmount) AS DE_GSBO_EAmount, 
    		SUM(DE_GSBO_CCVolume) AS DE_GSBO_CCVolume,
    		SUM(DE_GSBO_CCAmount) AS DE_GSBO_CCAmount, 
    		SUM(DE_GSBO_CTVolume) AS DE_GSBO_CTVolume, 
    		SUM(DE_GSBO_CTAmount) AS DE_GSBO_CTAmount,
    		SUM(DE_GSBO_VolumeTotals) AS DE_GSBO_VolumeTotals,
    		SUM(DE_GSBO_AmountTotals) AS DE_GSBO_AmountTotals
    	FROM 
    		CT_GroupStatisticByOiltype 
    	WHERE 
    		year(D_GSBO_GroupDate)='+CAST(@Year AS VARCHAR(10))+' AND
    		MONTH(D_GSBO_GroupDate) ='+CAST(@Month AS VARCHAR(10))+' '
    	IF(@GroupStationNO<>'')
    	BEGIN
    		SET @STRSQL= @STRSQL + ' AND I_GSBO_StationNo in('+@GroupStationNO+')'
    	END
    	SET @STRSQL= @STRSQL + ' GROUP BY 
    		I_GSBO_StationNo, C_GSBO_Name, C_GSBO_OilType 
    	Order by C_GSBO_OilType ASC'
    	EXECUTE(@STRSQL)
    END

    不一定使用在汇总过程中,比如说一张订单表 和一张订单明细表 当你增加一个订单的时候 要同时插入两个表,这时候可以使用事务,要么同时插入成功,要么同时插入不成功

    LZ还是先理解一下事务的概念还有事务使用的地方 ,只是知识网上很多资料的,也可以查MSDN


    给我写信: QQ我:点击这里给我发消息


    2012年12月24日 8:06