2008-10-07 3 views

답변

33

예, 시작 트랜잭션과 커밋 (또는 롤백)간에 수행하는은 트랜잭션의 일부입니다.

+5

이것은 완전히 사실이 아닙니다.실제로 테이블 변수에 대한 작업은 트랜잭션 범위 밖에 있습니다. 롤백은 테이블 변수에서 변경 한 내용에는 영향을주지 않습니다. –

+5

글쎄, 나는 데이터베이스에 대해 *하는 모든 것을 의미했다. * 나는 변수가 스칼라 변수보다 테이블 변수에 대해 덜 직관적이라고 가정하기는하지만 변수가 트랜잭션의 영향을받지 않는다는 것이 명백하다고 가정했다고 생각한다. – Blorgbeard

+0

외부 변환 내부에서 호출 된 Sp가 변환을 호출하면 어떻게됩니까? inner가 커밋 된 후에 외부 트랜잭션이 롤백을 호출하면 내부 트랜잭션이 롤백됩니까? – holaSenor

5

나는 MS SQL Server에서 스토어드 프로 시저 실행이 트랜잭션 내에서 일어날 것이라고 믿지만, 이것에 매우주의해야한다. 중첩 된 트랜잭션 (즉, 저장 프로 시저 외부의 트랜잭션과 저장 프로 시저 내부의 다른 트랜잭션)이있는 경우 롤백은 가장 가까운 트랜잭션을 포함 해 모든 트랜잭션에 영향을줍니다.

1

예, 모든 중첩 저장 프로 시저 호출은 트랜잭션 범위에 포함됩니다. SQL Server 2005 이상을 사용하는 경우 Try ... Catch를 사용할 수도 있습니다. Here에 대한 자세한 내용입니다.

11

대단히 감사합니다. 나는 이런 식으로 일을 끝냈다. (나는 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 
+0

이 작품! 감사! 네트워크 관련 오류가 발생하는 http://stackoverflow.com/questions/2715184/tsql-create-a-stored-proc-inside-a-transaction-statement의 KM 솔루션과 다릅니다. – knocte

5

Chris가 언급했듯이 트랜잭션을 롤백하는 것에주의해야한다.

는 특히이 :

IF @@TRANCOUNT > 0 ROLLBACK 

당신이 원하는 항상되지 않습니다. 당신이

IF(@@TRANCOUNT = 1) ROLLBACK TRAN 
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN 
RETURN @error 

처럼 이런 식으로 뭔가를 할 수있는 저장 프로 시저의 반환 값을 검사하고 어쨌든 커밋 또는 버블 오류를 계속하고자하는 경우를 결정할 수 호출 PROC.

이유는 'COMMIT'가 트랜잭션 카운터를 감소시키기 때문입니다. 트랜잭션 카운터를 0으로 감소 시키면 실제 커밋이 발생합니다.

1

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

더 많은 정보를 얻으 려 할 때 this을 보았습니다. 전체 트랜잭션을 롤백하지 않고 롤백 할 수있는 'savepoints'를 설정할 수 있습니다.

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

관련 문제