문제

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 CentraL, 나는 그것들을 읽는 것이 좋습니다.

여기 있습니다 :

예, 중첩 된 저장된 절차 호출은 거래 범위에 포함됩니다. SQL Server 2005 이상을 사용하는 경우 시도해 볼 수 있습니다. 여기 그것에 대한 자세한 내용입니다.

@chris, 나는 그것을 몰랐다.

더 많은 정보를 얻기 위해 인터넷 검색을 할 때, 나는 발견되었습니다 이것 - 전체 트랜잭션을 롤백하지 않고 다시 롤백 할 수있는 'SavePoints'를 설정할 수 있습니다.

이 상황에서 유용 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top