首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >COMMIT TRANSACTION请求没有对应BEGIN TRANSACTION

COMMIT TRANSACTION请求没有对应BEGIN TRANSACTION
EN

Stack Overflow用户
提问于 2011-08-08 14:58:09
回答 2查看 9.5K关注 0票数 1

这段代码有什么问题?

当过程中出现某些异常时,它会给出此错误的The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.。我该怎么解决它呢?

代码语言:javascript
运行
复制
    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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-08 15:31:14

拥有:

代码语言:javascript
运行
复制
IF @@ERROR <> 0
BEGIN
     ROLLBACK
END

在游标循环内部是一个不好的信号-您回滚事务,然后继续到下一次迭代。当循环最终结束时,您尝试提交事务,并且不再有打开的事务,回滚之后的每个操作都留在原地。

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

票数 7
EN

Stack Overflow用户

发布于 2012-05-10 19:47:30

您可以使用命名事务:

--一开始的大交易

开始事务BIG_TRANSACTION

--此处的代码--每个获取项的事务开始事务FETCH_TRANSACTION --此处的代码if OK COMMIT transaction FETCH_TRANSACTION else ROLLBACK TRANSACTION FETCH_TRANSACTION

提交/回滚事务BIG_TRANSACTION

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6978714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档