programing

SQL Server의 중첩된 트랜잭션

iphone6s 2023. 8. 5. 09:59
반응형

SQL Server의 중첩된 트랜잭션

다음 시나리오를 상상해 보십시오.

SQL Server 2005를 사용하고 있습니다.다른 SQL 문 중에서도 내부에 트랜잭션이 있는 저장 프로시저를 호출하는 트랜잭션이 있습니다.외부 트랜잭션은 때때로 실패하고 저장 프로시저가 성공적으로 호출되고 커밋된 후 롤백됩니다.

제 질문은 저장 프로시저의 트랜잭션도 롤백됩니까?

중첩 트랜잭션을 사용하는 경우 커밋은 최상위 트랜잭션을 제외하고 디스크에 변경 사항을 쓰지 않습니다.그러나 롤백은 트랜잭션 수준에 관계없이 작동하므로 내부 트랜잭션이 롤백됩니다.

물론 그렇습니다. 최상위 트랜잭션은 커밋되거나 롤백될 때까지 모든 데이터 변경 사항을 소유합니다.

하지만 거래 모델에 대해서는 신중하게 생각해 보시기 바랍니다.시스템에 이러한 시나리오가 많을수록 잠금 문제에 더 많이 노출됩니다.또한 절차의 계산 비용이 증가합니다.

SQL을 합리화할 때 트랜잭션이 필요하지 않은 곳에서 구현되는 빈도가 놀랍습니다.각 컨텍스트에서 트랜잭션을 사용하는 이유와 트랜잭션이 구현되지 않은 경우 어떤 일이 발생하는지 신중하게 생각해 보시기 바랍니다.딱 내 2c짜리야!

예, 저장 프로시저가 롤백됩니다.

코드의 전반적인 흐름은 다음과 같습니다.

BEGIN TRY

    BEGIN TRANSACTION

    EXEC SotredProcedureName

    --Do some other activity

    COMMIT TRANSACTION
END TRY
BEGIN CATCH

    --IF an error occurs then rollback the current transaction, which includes the stored procedure code.
    ROLLBACK TRANSACTION

END CATCH

건배, 존

저장 프로시저 안에서 begin tran 및 commit을 usp_test라고 입력해 보았습니다.
아래와 같이 다른 쿼리를 사용하여 이 sp를 실행합니다.

update x set name='xxx'
select * from x---contains 'xxx'
begin tran
update x set name='yyy'
select * from x---contains 'yyy'
exec usp_test
select * from x---contains 'zzz' inside the sp
rollback tran

x 테이블에서 위의 쿼리 이름을 실행하는 동안 첫 번째 시작부터 sptransmit도 백업했기 때문에 'zzz'가 아닌 'xxx'여야 합니다.
먼저 데이터 변경 내용을 변환합니다.

언급URL : https://stackoverflow.com/questions/527855/nested-transactions-in-sql-server

반응형