반응형
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)
좋은 소식은 SQL Server의 트랜잭션이 여러 배치(각각)에 걸쳐 있다는 것입니다.exec
별도의 배치로 처리됩니다.)
포장이 가능합니다.EXEC
의 진술.BEGIN TRANSACTION
그리고.COMMIT
그러나 오류가 발생하면 한 단계 더 나아가 롤백해야 합니다.
이상적으로는 다음과 같은 것을 원할 것입니다.
BEGIN TRY
BEGIN TRANSACTION
exec( @sqlHeader)
exec(@sqlTotals)
exec(@sqlLine)
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
그BEGIN TRANSACTION
그리고.COMMIT
저는 당신이 이미 잘 알고 있다고 믿습니다.그BEGIN TRY
그리고.BEGIN CATCH
블록은 기본적으로 발생하는 오류를 포착하고 처리하기 위해 존재합니다.만약 당신의 누군가가EXEC
문은 오류를 발생시킵니다. 코드 실행은 다음으로 이동합니다.CATCH
블록으로 막다
트랜잭션을 최대한 짧게 유지하려면 기존 SQL 빌드 코드가 트랜잭션 외부(위)에 있어야 합니다.
언급URL : https://stackoverflow.com/questions/15012886/how-to-rollback-or-commit-a-transaction-in-sql-server
반응형
'programing' 카테고리의 다른 글
Excel 오류: 제거된 레코드: /xl/워크시트/sheet10.xml 부분에서 정렬 (0) | 2023.07.17 |
---|---|
데이터 압축 알고리즘 (0) | 2023.07.17 |
홈브루를 사용하여 이전 버전의 파이썬 3을 macOS에 설치하려면 어떻게 해야 합니까? (0) | 2023.07.17 |
중첩된 잠금으로 인해 교착 상태가 발생하지 않는 이유는 무엇입니까? (0) | 2023.07.17 |
Git Submodule HEAD가 마스터에서 분리되는 이유는 무엇입니까? (0) | 2023.07.17 |