복붙노트

[SQL] 롤백 또는 SQL Server에서 트랜잭션을 커밋하는 방법

SQL

롤백 또는 SQL Server에서 트랜잭션을 커밋하는 방법

내 저장 프로 시저, 나는 세 가지 삽입 문이있다.

중복 키 값의 삽입에 처음 두 쿼리는 오류를 생성

그리고 세 번째 쿼리는 정상적으로 실행됩니다.

지금은 어떤 쿼리가 예외를 생성하는 경우, 모든 롤백 얻을해야합니다.

예외가 어떤 쿼리가 생성되지 않으면, 그것은 노력을하셔야합니다.

declare @QuantitySelected as char
    set @QuantitySelected = 2

    declare @sqlHeader as varchar(1000)
    declare @sqlTotals as varchar(1000)
    declare @sqlLine as varchar(1000)

    select @sqlHeader = 'Insert into tblKP_EstimateHeader '
    select @sqlHeader = @sqlHeader + '(CompanyID,CompanyName,ProjectName,EstimateID,EstimateHeader,QuoteDate,ValidUntil,RFQNum,Revision,Contact,Status,NumConfigurations) '
    select @sqlHeader = @sqlHeader + ' select CompanyID,CompanyName,ProjectName,EstimateID,EstimateHeader,QuoteDate,ValidUntil,RFQNum,Revision,Contact,Status,NumConfigurations '
    select @sqlHeader = @sqlHeader +  'from V_EW_Estimate_Header where EstimateID = 2203'



    select @sqlTotals = 'Insert into tblKP_Estimate_Configuration_Totals '
    select @sqlTotals = @sqlTotals + '(ConfigRecId,RecId,SellQty,ConfigNum,ConfigDesc,SortOrder,OptionsInMainPrice,MarkupPctQty,'
    select @sqlTotals = @sqlTotals + ' SellPriceQty,RubberStamp,OptPriceQty,StatusRecid,LastUpdate_Date,LastUpdate_User,TotalCost,QuantityBracketSelected)'
    select @sqlTotals = @sqlTotals + ' select ConfigRecId,RecId,SellQty' + @QuantitySelected + ',ConfigNum,ConfigDesc,SortOrder,OptionsInMainPrice'
    select @sqlTotals = @sqlTotals + ' ,MarkupPctQty' + @QuantitySelected + ',SellPriceQty' + @QuantitySelected + ',RubberStamp,OptPriceQty' + @QuantitySelected + ',StatusRecid,LastUpdate_Date,LastUpdate_User,TotalCost' + @QuantitySelected + ',' + @QuantitySelected
    select @sqlTotals = @sqlTotals + ' from v_EW_Estimate_Configuration_Totals where ConfigRecId = -3'


    select @sqlLine = 'Insert into tblKP_Estimate_Configuration_Lines'
    select @sqlLine = @sqlLine + '(MstrRfqRecId,RfqRecId,RfqLineRecId,CompanyId,VendorQuoteNum,LineGrp,LineNum,StatusRecId,'
    select @sqlLine = @sqlLine + ' LineDesc,LineSize,LineMatl,LineDeco,LineFinish,CopyFromRecId,PerPieceCost,IsOptional,'
    select @sqlLine = @sqlLine + ' CopyToNewRev,RecId,UnitPrice,LineQty,LinePrice,CustOrVend,SellQty1,RfqNum,ConfigLineIsOptional,ConfigLinePerPieceCost,ConfigLineRecid,SellPrice,SaleQty)'
    select @sqlLine = @sqlLine + ' select distinct MstrRfqRecId,RfqRecId,RfqLineRecId,CompanyId,VendorQuoteNum,LineGrp,LineNum,'
    select @sqlLine = @sqlLine + ' StatusRecId,LineDesc,LineSize,LineMatl,LineDeco,LineFinish,CopyFromRecId,PerPieceCost,IsOptional,'
    select @sqlLine = @sqlLine + ' CopyToNewRev,RecId,UnitPrice' + @QuantitySelected + ',LineQty' + @QuantitySelected + ', isnull(LinePrice' + @QuantitySelected + ', 0.0000),CustOrVend,SellQty' + @QuantitySelected + ',RfqNum,ConfigLineIsOptional,ConfigLinePerPieceCost,ConfigLineRecid,SellPrice' + @QuantitySelected + ',SaleQty' + @QuantitySelected
    select @sqlLine = @sqlLine + ' from v_EW_EstimateLine  where rfqlinerecid in (select RfqLineRecID from kp_tblVendorRfqConfigLine where ConfigRecID = -3) '

    exec( @sqlHeader)
    exec(@sqlTotals)
    exec(@sqlLine)

해결법

  1. ==============================

    1.좋은 뉴스는 SQL Server의 트랜잭션이 여러 배치를 확장 할 수있다 (각 임원이 별도의 배치로 처리됩니다.)

    좋은 뉴스는 SQL Server의 트랜잭션이 여러 배치를 확장 할 수있다 (각 임원이 별도의 배치로 처리됩니다.)

    A는 트랜잭션을 시작하고 COMMIT에 당신은 당신의 EXEC 문을 포장 할 수 있지만 당신은 어떤 오류가 발생하면 더 롤백 단계를 이동해야합니다.

    이상적으로 당신이 뭔가를 원하는 것 :

    BEGIN TRY
        BEGIN TRANSACTION 
            exec( @sqlHeader)
            exec(@sqlTotals)
            exec(@sqlLine)
        COMMIT
    END TRY
    BEGIN CATCH
    
        IF @@TRANCOUNT > 0
            ROLLBACK
    END CATCH
    

    트랜잭션을 시작하고 난 당신이 익숙한 믿는다 COMMIT. 시도를 시작하고 CATCH 블록 캐치에 기본적으로 시작하여 발생하는 모든 오류를 처리합니다. 당신의 EXEC 문의는 오류가 발생하는 경우, 코드의 실행은 CATCH 블록으로 이동합니다.

    기존 SQL 구축 코드 (위) 항상 가능한 짧게 당신의 거래를 유지하기 원하는 트랜잭션 외부해야한다.

  2. from https://stackoverflow.com/questions/15012886/how-to-rollback-or-commit-a-transaction-in-sql-server by cc-by-sa and MIT license