COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION

时间:2011-08-08 06:58:09

标签: sql tsql sql-server-2008

此代码有什么问题。

当程序中出现一些异常时,它会给出此错误The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.。我该如何解决?

    BEGIN 
    BEGIN TRANSACTION 
    DECLARE  
         @Id bigint 
        ,@Month nvarchar(100) 
        ,@Year nvarchar(100) 
        ,@CountryofExport nvarchar(100)
        ,@CountryofOrigin nvarchar(100) 
        ,@HSCode nvarchar(100)
        ,@Unit nvarchar(100)
        ,@Quantity nvarchar(100)
        ,@CustomValue nvarchar(255)
        ,@Type nvarchar(100)
        ,@TypeBit bit
        ,@CountryofExportID int
        ,@CountryofOriginID int
        ,@MeasurementId int
        ,@Remarks nvarchar(500)
        ,@CommodityId int
        ,@SDate nvarchar(100)
        ,@SameRec int
        ,@counts int


    DECLARE @Cursor_TradeFlow CURSOR
    SET @Cursor_TradeFlow = CURSOR FOR

    SELECT [Id],[Months],[Years],[CountryofExport],[CountryofOrigin],[HSCode],[Quantity],[Unit],[CustomValue],[Type] FROM [Temp_Trading]    

    OPEN @Cursor_TradeFlow
    FETCH NEXT FROM @Cursor_TradeFlow INTO @Id, @Month, @Year, @CountryofExport, @CountryofOrigin, @HSCode,@Quantity, @Unit, @CustomValue, @Type

    WHILE @@FETCH_STATUS = 0

    BEGIN
    Set @Remarks='';




   Declare @EICountry varchar(100),
   @Checkbit bit,
    @CheckYearIsNumeric bit,
    @CheckMonthIsNumeric bit


      BEGIN TRY        

         SET @CheckMonthIsNumeric= convert(INT, @Month);

      END TRY 

      BEGIN CATCH
    begin

             set @Checkbit=1;
         set @Remarks = @Remarks + 'Invalid Month'
         set @CheckMonthIsNumeric=1 
         end
      END CATCH



      BEGIN TRY

          set @CheckYearIsNumeric=  convert(INT, @Year);

      END TRY
      BEGIN CATCH


        SET @CheckYearIsNumeric= 1;
        set @Checkbit=1;
        set @Remarks = @Remarks + 'Invalid Year'

      END CATCH      


    Set @SameRec = (Select COUNT(*) From TradeFlow Where int_Month = @CheckMonthIsNumeric and int_Year = @CheckYearIsNumeric
                  and int_OriginLocationId = @CountryofExportID and int_DestinationLocationId = @CountryofOriginID and int_CommodityId = @CommodityId
                  and int_MeasurementId = @MeasurementId)   


    IF @@ERROR <> 0
    BEGIN
         ROLLBACK
    END

    FETCH NEXT FROM @Cursor_TradeFlow INTO @Id, @Month, @Year, @CountryofExport, @CountryofOrigin, @HSCode,@Quantity, @Unit, @CustomValue, @Type

    END
    CLOSE @Cursor_TradeFlow
    DEALLOCATE @Cursor_TradeFlow
    COMMIT
END

2 个答案:

答案 0 :(得分:7)

有:

IF @@ERROR <> 0
BEGIN
     ROLLBACK
END

在游标循环内部是一个坏标志 - 您回滚事务,然后继续进入下一次迭代。当循环最终完成时,您尝试提交并且 - 哎呀 - 不再有打开的事务,并且在回滚之后的每个操作都保留在原位。

您可能希望在回滚后使用GOTO退出循环,或以不同方式处理错误。很难说出最佳策略可能是什么。

答案 1 :(得分:0)

您可以使用命名交易:

  

- 开头的大交易
    开始交易BIG_TRANSACTION

-- your code here

-- a transaction for each fetched item 
BEGIN TRANSACTION FETCH_TRANSACTION
-- your code here
if OK
    COMMIT TRANSACTION FETCH_TRANSACTION
else
    ROLLBACK TRANSACTION FETCH_TRANSACTION
     

COMMIT / ROLLBACK TRANSACTION BIG_TRANSACTION

相关问题