none
事故的效果 RRS feed

  • 问题

  • begin try
        begin tran

    If @RowCnt1 > 0 
    Begin
    Update EnergyDataSumByYearN Set SumQty = SumQty + @Qty 
    Where MeterNo = @MeterNo And MeterType = @MeterType And DAYear = @DAYear ;
    End
    Else
    Begin
    Insert EnergyDataSumByYearN(MeterNo,MeterType,DAYear,SumQty,Unit)
    Select @MeterNo,@MeterType,@DAYear,@Qty,@Unit;
    End

    If @RowCnt2 > 0 
    Begin
    Update EnergyDataSumByMonthN Set SumQty = SumQty + @Qty 
    Where MeterNo = @MeterNo And MeterType = @MeterType And DAYear = @DAYear And DAMonth = @DAMonth;
    End
    Else
    Begin
    Insert EnergyDataSumByMonthN(MeterNo,MeterType,DAYear,DAMonth,SumQty,Unit)
    Select @MeterNo,@MeterType,@DAYear,@DAMonth,@Qty,@Unit;
    End

    If @RowCnt3 > 0 
    Begin
    Update EnergyDataSumByDayN Set SumQty = SumQty + @Qty 
    Where MeterNo = @MeterNo And MeterType = @MeterType And DAYear = @DAYear And DAMonth = @DAMonth And DADay = @DADay;
    End
    Else
    Begin
    Insert EnergyDataSumByDayN(MeterNo,MeterType,DAYear,DAMonth,DADay,SumQty,Unit)
    Select @MeterNo,@MeterType,@DAYear,@DAMonth,@DADay,@Qty,@Unit;
    End

    If @RowCnt4 > 0 
    Begin
    Update EnergyDataSumByHourN Set SumQty = SumQty + @Qty 
    Where MeterNo = @MeterNo And MeterType = @MeterType  And  DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') + IsNull(@DADay,'')
    And DAHour = @DAHour ;
    End
    Else
    Begin
    Insert EnergyDataSumByHourN(MeterNo,MeterType,DADay,DAHour,SumQty,Unit)
    Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull(@DAMonth,'') + IsNull(@DADay,''),@DAHour,@Qty,@Unit;
    End
    --Exec Usp_TransferDAListToEnergyData @MeterNo,@MeterType,@DATime,@Qty,@Unit 
       end try
       begin catch
       rollback tran    --处理失败 数据回滚
        end catch
     

    问题:这个事故过程是,如果这里的几个“Insert”和“Update”方法,有一个执行不成功,那么就整个数据库回滚对吧???

    大师,请您看下,这些代码有没有问题。

    Science and technology is my lover.

    2012年12月22日 8:26

答案

  • LZ你应该在底部加上commit tran 提交事务 

    不是整个数据库回滚 是整个事务回滚

    一般最后是这样写的

    		IF (@@ERROR <> 0)
    		BEGIN
    			PRINT('ROLLBACK TRANSACTION')
    			ROLLBACK TRANSACTION
    			SET @ReturnValue = -2
    		END
    		ELSE
    		BEGIN
    			COMMIT TRANSACTION
    			SET @ReturnValue = 0
    		END

    如果时间比较紧的话,可以在事务的开头加上这一句SET XACT_ABORT ON

    SQL自己会判断当事务处理失败的时候会自动回滚整个事务


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

    2012年12月23日 3:23

全部回复

  • LZ你应该在底部加上commit tran 提交事务 

    不是整个数据库回滚 是整个事务回滚

    一般最后是这样写的

    		IF (@@ERROR <> 0)
    		BEGIN
    			PRINT('ROLLBACK TRANSACTION')
    			ROLLBACK TRANSACTION
    			SET @ReturnValue = -2
    		END
    		ELSE
    		BEGIN
    			COMMIT TRANSACTION
    			SET @ReturnValue = 0
    		END

    如果时间比较紧的话,可以在事务的开头加上这一句SET XACT_ABORT ON

    SQL自己会判断当事务处理失败的时候会自动回滚整个事务


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

    2012年12月23日 3:23
  • begin    try”比“

    IF (@@ERROR <> 0)

    资源开销要大,对吧???

    对吭,不“commit tran”。“begin try   begin tran  end try”,它不会自动提交吗???    


    Science and technology is my lover.

    2012年12月24日 2:33
  • ”。“begin try   begin tran  end try” 是捕获异常

    LZ你需要加上commit tran才能提交事务

    LZ可以查一下资料


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

    2012年12月24日 5:36