2011-08-08 8 views
1

이 코드의 문제점은 무엇입니까?COMMIT TRANSACTION 요청에 해당하는 BEGIN TRANSACTION이 없습니다.

절차에서 예외가 발생하면 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

모든 관련 코드를 제시해주십시오/롤백 TRANSACTION COMMIT . 코드에'COMMIT TRANSACTION'이 없습니다. –

+0

이미 여러 곳에서 Try/Catch를 사용하고 있습니다. @@ Error 대신에 사용하지 않는 이유가 있습니까? 예를 들어 현재 @@ 오류 검사 대신 전체 루프를 둘러싼 글로벌 시도/catch는 문제에 대한 단순한 해결책이 될 수 있습니다. 예기치 않은 문제로 모든 것을 되돌릴 수 있습니다. – Tao

+0

왜 커서를 사용하고 있습니까? – HLGEM

답변

7

갖는

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK 
END 

을 커서 루프 내에서하는 것은 나쁜 징조 - 당신은 트랜잭션을 롤백하고 다음 반복으로 계속합니다. 루프가 마침내 끝나면 커밋하려고 시도하고 - 죄송합니다 - 더 이상 열려있는 트랜잭션이없고 롤백 이후의 모든 작업이 그대로 유지됩니다.

GOTO을 사용하여 롤백 한 후 루프를 종료하거나 다른 방법으로 오류를 처리 할 수 ​​있습니다. 최고의 전략이 무엇인지 알기는 너무 어렵습니다.

0

님의 이름을 사용할 수 있습니다 거래 :

- 처음에 큰 거래
BEGIN TRANSACTION은 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 

는 BIG_TRANSACTION

관련 문제