복붙노트

[SQL] 저장 프로 시저에서 "SET XACT_ABORT ON"을 사용의 이점은 무엇입니까?

SQL

저장 프로 시저에서 "SET XACT_ABORT ON"을 사용의 이점은 무엇입니까?

저장 프로 시저에서 SET XACT_ABORT ON을 사용의 이점은 무엇입니까?

해결법

  1. ==============================

    1.SET XACT_ABORT ON 런타임 오류가 발생하면 일괄 전체 트랜잭션을 롤백하고 중단 SQL 서버에 지시합니다. 그것은 클라이언트 응용 프로그램보다는 SQL 서버 자체 내에서 발생하는 명령 시간 제한과 같은 경우를 포함 (기본 XACT_ABORT OFF 설정이 적용되지 않습니다.)

    SET XACT_ABORT ON 런타임 오류가 발생하면 일괄 전체 트랜잭션을 롤백하고 중단 SQL 서버에 지시합니다. 그것은 클라이언트 응용 프로그램보다는 SQL 서버 자체 내에서 발생하는 명령 시간 제한과 같은 경우를 포함 (기본 XACT_ABORT OFF 설정이 적용되지 않습니다.)

    (당신이 그렇지 않으면 할 수있는 특별한 이유가없는 한) 거래를 열린 상태로됩니다 쿼리 시간 제한이 SET XACT_ABORT ON가 열려있는 트랜잭션과의 연결 작업을 수행하는 응용 프로그램의 결과로 명시 적 트랜잭션의 모든 저장 프로 시저에 추천되기 때문에 재앙이다 .

    댄 구즈의 블로그에 정말 좋은 개요가있다,

  2. ==============================

    2.제 생각에는 SET XACT_ABORT ON은 SQL 2K5에 CATCH를 BEGIN / TRY을 BEGIN의 추가에 의해 폐기되었다. 거래-SQL에서 예외 블록 전에 오류를 처리하기 위해 정말 어려웠다 불균형 절차는 너무 일반적인 (항목에 비해 출구에서 다른 @@ TRANCOUNT가 있었다 절차)이었다.

    제 생각에는 SET XACT_ABORT ON은 SQL 2K5에 CATCH를 BEGIN / TRY을 BEGIN의 추가에 의해 폐기되었다. 거래-SQL에서 예외 블록 전에 오류를 처리하기 위해 정말 어려웠다 불균형 절차는 너무 일반적인 (항목에 비해 출구에서 다른 @@ TRANCOUNT가 있었다 절차)이었다.

    거래-SQL 예외 처리의 추가로 제대로 거래의 균형을 보장하는 올바른 절차를 작성하기가 훨씬 더 쉽습니다. 예를 들어 나는 예외 처리 및 중첩 된 트랜잭션이 템플릿을 사용 :

    create procedure [usp_my_procedure_name]
    as
    begin
        set nocount on;
        declare @trancount int;
        set @trancount = @@trancount;
        begin try
            if @trancount = 0
                begin transaction
            else
                save transaction usp_my_procedure_name;
    
            -- Do the actual work here
    
    lbexit:
            if @trancount = 0   
                commit;
        end try
        begin catch
            declare @error int, @message varchar(4000), @xstate int;
            select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
            if @xstate = -1
                rollback;
            if @xstate = 1 and @trancount = 0
                rollback
            if @xstate = 1 and @trancount > 0
                rollback transaction usp_my_procedure_name;
    
            raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
        end catch   
    end
    go
    

    그것은 나를 복구 오류가 발생하는 경우에만 자신의 작업을 롤백 원자 프로 시저를 작성 할 수 있습니다.

    주요 이슈 중 하나는 거래-SQL 프로 시저의 얼굴은 데이터 순도 : 때때로 매개 변수를 수신하거나 테이블의 데이터가 중복 키 오류, 참조 구속 오류, 체크 구속 오류가 발생하고 등등 등등, 그냥 일반 잘못이다. 이러한 데이터 무결성 오류가 불가능할 것이다 및 비즈니스 로직에 의해 체포 모두의 제약을 모두 폐기 (효과 추가 극적인 과장) 될 경우 결국, 즉, 바로 이러한 제약을의 역할입니다. XACT_ABORT 다음 ON 인 경우 모든 오류는 정상적으로 예외를 처리하는 코드 예외 블록 수있는 대조적으로 손실되는 전체 트랜잭션이 발생할. 전형적인 예는 INSERT을하려고와 PK 위반에 UPDATE로 복귀한다.

  3. ==============================

    3.MSDN을 인용 :

    MSDN을 인용 :

    문장의 일부가 거래 '부분적으로 완성 된'를 떠나, 실패 할 수 있습니다 및 호출이 실패의 흔적이 없을 수도 실제로이 방법.

    간단한 예 :

    INSERT INTO t1 VALUES (1/0)    
    INSERT INTO t2 VALUES (1/1)    
    SELECT 'Everything is fine'
    

    이 코드는 XACT_ABORT OFF로 '성공적으로'실행 것이며, XACT_ABORT ON과 오류로 종료됩니다 (실행되지 않습니다 'INSERT INTO의 T2', 그리고 클라이언트 응용 프로그램 예외가 발생합니다).

    보다 유연한 접근 방식으로, 당신은 @@ 각 문 (오래된 학교) 후 오류, 또는 사용 TRY ... CATCH 블록 (MSSQL2005 +)를 확인할 수 있습니다. 개인적으로 나는 몇 가지 고급 오류 처리에 대한 이유가 없다 때마다 XACT_ABORT ON을 설정하는 것을 선호합니다.

  4. ==============================

    4.클라이언트 시간 초과하고이를 처리 할 수 ​​XACT_ABORT의 사용과 관련하여, 제 생각에이하는 SqlClient 같은 클라이언트 API를에서 시간 제한을 가지고 적어도 하나의 아주 좋은 이유는, 그것은 SQL 서버 코드에서 발생하는 교착 상태에서 클라이언트 응용 프로그램 코드를 보호하는 것입니다. 이 경우 클라이언트 코드는 아무 잘못이 없습니다, 그러나 영원히 차단 명령이 서버에 완료 될 때까지 대기에서 그것을 자신을 보호 할 수 있습니다. 클라이언트 시간 제한 보호 클라이언트 코드에 존재해야한다면, 반대로, 그래서 XACT_ABORT ON은 서버 코드는 클라이언트가 기다릴 것보다 실행하는 데 시간이 더 걸리는 경우 클라이언트 중단한다에서 보호 서버 코드에있다 않습니다.

    클라이언트 시간 초과하고이를 처리 할 수 ​​XACT_ABORT의 사용과 관련하여, 제 생각에이하는 SqlClient 같은 클라이언트 API를에서 시간 제한을 가지고 적어도 하나의 아주 좋은 이유는, 그것은 SQL 서버 코드에서 발생하는 교착 상태에서 클라이언트 응용 프로그램 코드를 보호하는 것입니다. 이 경우 클라이언트 코드는 아무 잘못이 없습니다, 그러나 영원히 차단 명령이 서버에 완료 될 때까지 대기에서 그것을 자신을 보호 할 수 있습니다. 클라이언트 시간 제한 보호 클라이언트 코드에 존재해야한다면, 반대로, 그래서 XACT_ABORT ON은 서버 코드는 클라이언트가 기다릴 것보다 실행하는 데 시간이 더 걸리는 경우 클라이언트 중단한다에서 보호 서버 코드에있다 않습니다.

  5. ==============================

    5.오류가 롤백 트랜잭션이 발생할 수 있도록 트랜잭션 관리에 사용됩니다.

    오류가 롤백 트랜잭션이 발생할 수 있도록 트랜잭션 관리에 사용됩니다.

  6. from https://stackoverflow.com/questions/1150032/what-is-the-benefit-of-using-set-xact-abort-on-in-a-stored-procedure by cc-by-sa and MIT license