SQL에서 저장 프로 시저를 만들고 BEGIN/END TRANSACTION 내에서 호출하면 (EXEC spStoredProcedure
)이 다른 저장 프로 시저도 트랜잭션에 포함됩니까?BEGIN/END TRANSACTION 내에서 저장 프로 시저 실행
C#에서 try/catch와 같이 작동하는지 몰랐습니다.
SQL에서 저장 프로 시저를 만들고 BEGIN/END TRANSACTION 내에서 호출하면 (EXEC spStoredProcedure
)이 다른 저장 프로 시저도 트랜잭션에 포함됩니까?BEGIN/END TRANSACTION 내에서 저장 프로 시저 실행
C#에서 try/catch와 같이 작동하는지 몰랐습니다.
예, 시작 트랜잭션과 커밋 (또는 롤백)간에 수행하는은 트랜잭션의 일부입니다.
나는 MS SQL Server에서 스토어드 프로 시저 실행이 트랜잭션 내에서 일어날 것이라고 믿지만, 이것에 매우주의해야한다. 중첩 된 트랜잭션 (즉, 저장 프로 시저 외부의 트랜잭션과 저장 프로 시저 내부의 다른 트랜잭션)이있는 경우 롤백은 가장 가까운 트랜잭션을 포함 해 모든 트랜잭션에 영향을줍니다.
예, 모든 중첩 저장 프로 시저 호출은 트랜잭션 범위에 포함됩니다. SQL Server 2005 이상을 사용하는 경우 Try ... Catch를 사용할 수도 있습니다. Here에 대한 자세한 내용입니다.
대단히 감사합니다. 나는 이런 식으로 일을 끝냈다. (나는 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
이 작품! 감사! 네트워크 관련 오류가 발생하는 http://stackoverflow.com/questions/2715184/tsql-create-a-stored-proc-inside-a-transaction-statement의 KM 솔루션과 다릅니다. – knocte
Chris가 언급했듯이 트랜잭션을 롤백하는 것에주의해야한다.
는 특히이 :
IF @@TRANCOUNT > 0 ROLLBACK
당신이 원하는 항상되지 않습니다. 당신이
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
처럼 이런 식으로 뭔가를 할 수있는 저장 프로 시저의 반환 값을 검사하고 어쨌든 커밋 또는 버블 오류를 계속하고자하는 경우를 결정할 수 호출 PROC.
이유는 'COMMIT'가 트랜잭션 카운터를 감소시키기 때문입니다. 트랜잭션 카운터를 0으로 감소 시키면 실제 커밋이 발생합니다.
@Chris, 나는 그것을 몰랐다.
더 많은 정보를 얻으 려 할 때 this을 보았습니다. 전체 트랜잭션을 롤백하지 않고 롤백 할 수있는 'savepoints'를 설정할 수 있습니다.
이 상황에서 유용 할 수 있습니다.
언급 한대로 Chris과 James은 중첩 된 트랜잭션을 다룰 때주의해야합니다. 가 여기에
:
이것은 완전히 사실이 아닙니다.실제로 테이블 변수에 대한 작업은 트랜잭션 범위 밖에 있습니다. 롤백은 테이블 변수에서 변경 한 내용에는 영향을주지 않습니다. –
글쎄, 나는 데이터베이스에 대해 *하는 모든 것을 의미했다. * 나는 변수가 스칼라 변수보다 테이블 변수에 대해 덜 직관적이라고 가정하기는하지만 변수가 트랜잭션의 영향을받지 않는다는 것이 명백하다고 가정했다고 생각한다. – Blorgbeard
외부 변환 내부에서 호출 된 Sp가 변환을 호출하면 어떻게됩니까? inner가 커밋 된 후에 외부 트랜잭션이 롤백을 호출하면 내부 트랜잭션이 롤백됩니까? – holaSenor