programing

SQL Server는 트랜잭션과 관련하여 저장 프로시저 내의 문을 어떻게 처리합니까?

css3 2023. 8. 13. 09:56

SQL Server는 트랜잭션과 관련하여 저장 프로시저 내의 문을 어떻게 처리합니까?

예를 들어 여러 개의 개별 SELECT, INSERT, UPDATE 및 DELETE 문으로 구성된 저장 프로시저가 있다고 가정합니다.명시적인 BEGIN TRANS / COMMIT TRANS / Rollback TRANS 로직이 없습니다.

SQL Server는 이 저장 프로시저를 트랜잭션 방식으로 어떻게 처리합니까?각 문에 암묵적인 연결이 있습니까?아니면 저장 프로시저에 대해 한 번의 트랜잭션이 발생합니까?

또한 T-SQL 및/또는 SQL Server Management Studio를 사용하여 어떻게 스스로 이 문제를 발견할 수 있었을까요?

감사합니다!

저장 프로시저 내의 SQL 명령 수에 관계없이 프로시저를 실행하는 데 사용되는 연결은 하나뿐입니다.

저장 프로시저에 명시적인 BEGEN TRANCENT가 없으므로 오류가 발생한 경우 변경 내용을 롤백할 수 없는 상태로 각 문이 자체적으로 실행됩니다.

그러나 저장 프로시저를 호출하기 전에 트랜잭션을 시작하면 모든 문이 트랜잭션 내에서 그룹화되고 저장 프로시저 실행 후 커밋되거나 롤백될 수 있습니다.

저장 프로시저 내에서 시스템 변수 @@TRANCOUNT(Transact-SQL)의 값을 확인하여 트랜잭션 내에서 실행 중인지 여부를 확인할 수 있습니다.0은 트랜잭션이 없음을 의미하며, 다른 모든 항목은 현재 중첩된 트랜잭션 수준을 나타냅니다.SQL 서버 버전에 따라 XACT_STATE(Transact-SQL)도 사용할 수 있습니다.

다음을 수행하는 경우:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

절차 내의 모든 것은 트랜잭션, 6개의 문(EXEC는 트랜잭션의 문, 1+5=6)에 의해 처리됩니다.이 작업을 수행할 경우:

BEGIN TRANSACTION

EXEC my_stored_procedure_with_5_statements_inside @Parma1
EXEC my_stored_procedure_with_5_statements_inside @Parma1

COMMIT

두 프로시저 호출 내의 모든 것이 트랜잭션, 즉 12개의 문에 의해 처리됩니다(두 EXEC 모두 트랜잭션에 의해 처리됨, 1+5+1+5=12).

테스트 테이블에 레코드를 삽입하는 것과 같이 간단한 작업을 수행하는 작은 저장 프로시저를 만들어 직접 확인할 수 있습니다.그런 다음 Trans를 시작하고 sp_test를 실행하고 롤백합니다. 새 레코드가 있습니까?그렇다면 SP는 외부 트랜잭션을 무시합니다.그렇지 않다면 SP는 트랜잭션 내부에서 실행되는 또 다른 명령문일 뿐입니다.

트랜잭션은 세션의 상태임을 이해해야 합니다.BEGIN TRANSACTION 명령이 던져진 곳(루틴에 입력하기 전 또는 루틴 코드 내부)에 세션에서 실행된 BEGIN TRANSACTION이 하나 이상 있기 때문에 세션이 명시적 트랜잭션 상태에 있을 수 있습니다.그렇지 않으면 세션의 상태가 암시적 트랜잭션 상태가 됩니다.여러 개의 BEGIN TRANACTION을 가질 수 있지만 첫 번째 트랜잭션만 세션의 동작을 변경합니다.나머지는 @TRANCOUNT 글로벌 세션 변수만 증가시킵니다.

암시적 트랜잭션 상태는 모든 SQL 주문(DDL, DML 및 DCL 명령)에 보이지 않는 통합 트랜잭션 범위가 있음을 의미합니다.

언급URL : https://stackoverflow.com/questions/2622069/how-does-sql-server-treat-statements-inside-stored-procedures-with-respect-to-tr