시작/종료 트랜잭션 내부에서 저장된 절차 실행
-
05-07-2019 - |
문제
SQL로 저장된 절차를 작성하고 호출하는 경우 (EXEC spStoredProcedure
) 시작/종료 트랜잭션 내 에서이 다른 저장된 절차도 트랜잭션에 속합니까?
C#에서 시도/잡기처럼 작동했는지 몰랐습니다.
해결책
예, 모든 것 트랜잭션 시작과 커밋 (또는 롤백) 사이에하는 것은 거래의 일부입니다.
다른 팁
좋은 것 같네요, 고마워요. 나는 이런 일을하게되었다 (05에 있기 때문에)
BEGIN TRY
BEGIN TRANSACTION
DO SOMETHING
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
MS SQL Server를 믿는 것은 저장 프로 시저 실행이 트랜잭션 내에서 발생할 것이지만 이에 대해 매우주의를 기울입니다. 트랜잭션 중첩 (즉, 저장된 절차 외부의 트랜잭션 및 저장 프로 시저 내부의 다른 트랜잭션)이있는 경우 롤백은 가장 가까운 동요 거래뿐만 아니라 모든 트랜잭션에 영향을 미칩니다.
Chris가 언급했듯이, 거래를 되돌려 놓는 것에주의해야합니다.
특히 이것은 다음과 같습니다.
IF @@TRANCOUNT > 0 ROLLBACK
항상 당신이 원하는 것은 아닙니다. 당신은 이런 일을 할 수 있습니다
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
이런 식으로, 호출 Proc은 저장된 절차에서 반환 값을 검사하고 어쨌든 커밋하고 싶은지 또는 오류를 계속 기포 할 것인지 결정할 수 있습니다.
그 이유는 '커밋'이 거래 카운터를 줄이기 때문입니다. 트랜잭션 카운터를 0으로 줄이면 실제 커밋이 발생합니다.
예, 중첩 된 저장된 절차 호출은 거래 범위에 포함됩니다. SQL Server 2005 이상을 사용하는 경우 시도해 볼 수 있습니다. 여기 그것에 대한 자세한 내용입니다.
@chris, 나는 그것을 몰랐다.
더 많은 정보를 얻기 위해 인터넷 검색을 할 때, 나는 발견되었습니다 이것 - 전체 트랜잭션을 롤백하지 않고 다시 롤백 할 수있는 'SavePoints'를 설정할 수 있습니다.
이 상황에서 유용 할 수 있습니다.