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
'programing' 카테고리의 다른 글
MariaDB 외부 키 제약 조건이 잘못 형성되었습니다. (0) | 2023.08.13 |
---|---|
최고의 MySQL 성능 튜닝 도구? (0) | 2023.08.13 |
Android:다중선 텍스트 편집(텍스트 영역)에 대한 수직 정렬 (0) | 2023.08.13 |
: a 의심중요소: a 의심중요소: a 의심중요소요소 (0) | 2023.08.13 |
Excel4Macro를 실행하여 닫힌 워크북에서 값을 얻습니다. (0) | 2023.08.13 |