어떻게 트랜잭션을 사용하는지에 대한 많은 질문이 있습니다. 내가 알고 싶은 것은 언제일까요? 어떤 상황에서? 어떤 유형의 쿼리입니까? Try-Catch 블록으로 충분할 수 있습니까? 기타 ...SQL Server에서 트랜잭션을 사용하는 경우
~ 20 개의 테이블과 ~ 20 개의 저장 프로 시저로 데이터베이스를 설계했습니다. 현재 내 SP 중 누구도 트랜잭션을 사용하지 않지만 전체적으로 수많은 Try-Catch 블록이 있습니다. 그 이유는 트랜잭션에서 랩 할 때마다 SP가 작동을 멈추고 누락 된 데이터로 끝날 것이고 Trans를 사용한 것보다 나빠질 것이기 때문입니다. 그래서 다시
...- 트랜잭션을 사용할 수있는 적절한 시간이?
- 후속 질문으로, 내가 사용하는 경우, 내 SP를 유발하는 것보다 부패를 방지하기 위해 다른 SP가 동시에 같은 데이터에 액세스하는 것을 방지하는 방법으로 어떻게 사용할 수 있습니까? 전혀 작동하지 않겠습니까?
저는 여기에 제품 이름을 바꾸기 위해 쓴 작은 샘플 SP는 다음과 같습니다
CREATE PROCEDURE spRenameProduct
@pKey int = NULL,
@pName varchar(50)
AS
BEGIN
BEGIN TRY
IF LTRIM(RTRIM(@pName)) = '' SET @pName = NULL
IF NOT @pKey IS NULL AND NOT @pName IS NULL BEGIN
declare @pKeyExisting int = (select MIN(ID) from rProduct where Product like @pName and not ID = @pKey)
IF @pKeyExisting is null BEGIN
update rProduct set IsValid = 1, Product = @pName where ID = @pKey
END ELSE BEGIN
update Request set ProductID = @pKeyExisting where ProductID = @pKey
update StatusReport set ProductID = @pKeyExisting where ProductID = @pKey
delete from rProduct where ID = @pKey
END
END
END TRY BEGIN CATCH END CATCH
END
이제 어떻게 두 사람이 동일한 시간에이를 사용한다면? 나는 정말로 싶지도 않고, 나에게는 시간이있다 (불행하게도). 키스. 이 경우에 가장 좋습니다. :)
격리 수준을 트랜잭션과 혼합합니다. 격리를 사용하면 해당 단일 명령문이 지속되는 동안 다른 업데이트를 잠글 수 있습니다. 업데이트가 필요하거나 전체적으로 실패 할 경우 트랜잭션으로 래핑합니다. 두 개의 업데이트와 하나의 삭제를 동기화 상태로 유지하려면 트랜잭션이 수행 할 수있는 작업입니다. – Paparazzi
@ BalamBalam 즉, 트랜잭션에서 두 개의 업데이트와 하나의 삭제 만 래핑하는 것이 좋지만 항상 전체 SP를 래핑하는 것은별로 의미가 없습니까? 그럼에도 불구하고 때때로 개발자들이 실수를 저지르기 때문에 때때로 trans가 너무 복잡해서 작업하기가 힘듭니다. null 참조 또는 무언가와 같은 무해한 예외 때문에 응용 프로그램이 실패하는 것을 원하지는 않습니다. 지혜의 말은 없습니까? 아직도 이것에 새롭다 :) – Chiramisu
나는 그것을 더 명확하게 말하는 방법을 모른다. 세트 전체가 실패하거나 성공할 필요가 있다면 트랜잭션으로 랩핑하십시오. 고전적인 예는 수표에서 예금 계좌로 돈을 이체하는 것입니다. 예금이 실패하면 인출이 실패하기를 원합니다. 개발자 실수로 인해 데이터가 동기화되지 않는 경우 트랜잭션을 사용하지 마십시오. – Paparazzi