У запроса COMMIT TRANSACTION нет соответствующей BEGIN TRANSACTION - PullRequest
1 голос
/ 08 августа 2011

В чем проблема с этим кодом.

Выдает эту ошибку 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 ]

7 голосов
/ 08 августа 2011

Наличие:

IF @@ERROR <> 0
BEGIN
     ROLLBACK
END

внутри цикла курсора является плохим признаком - вы откатываете транзакцию и затем переходите к следующей итерации.Когда цикл, наконец, завершается, вы пытаетесь зафиксировать и, к сожалению, больше нет открытых транзакций, и каждая операция после отката остается на месте.

Возможно, вы захотите выйти из цикла после отката, используяGOTO, или по-другому разберитесь с ошибками.Слишком сложно сказать, какой может быть лучшая стратегия.

0 голосов
/ 10 мая 2012

Вы можете использовать именованные транзакции:

- большая сделка в начале
НАЧАЛО СДЕЛКИ 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...