[SQL] 저장 프로 시저에서 "SET XACT_ABORT ON"을 사용의 이점은 무엇입니까?
SQL저장 프로 시저에서 "SET XACT_ABORT ON"을 사용의 이점은 무엇입니까?
저장 프로 시저에서 SET XACT_ABORT ON을 사용의 이점은 무엇입니까?
해결법
-
==============================
1.SET XACT_ABORT ON 런타임 오류가 발생하면 일괄 전체 트랜잭션을 롤백하고 중단 SQL 서버에 지시합니다. 그것은 클라이언트 응용 프로그램보다는 SQL 서버 자체 내에서 발생하는 명령 시간 제한과 같은 경우를 포함 (기본 XACT_ABORT OFF 설정이 적용되지 않습니다.)
SET XACT_ABORT ON 런타임 오류가 발생하면 일괄 전체 트랜잭션을 롤백하고 중단 SQL 서버에 지시합니다. 그것은 클라이언트 응용 프로그램보다는 SQL 서버 자체 내에서 발생하는 명령 시간 제한과 같은 경우를 포함 (기본 XACT_ABORT OFF 설정이 적용되지 않습니다.)
(당신이 그렇지 않으면 할 수있는 특별한 이유가없는 한) 거래를 열린 상태로됩니다 쿼리 시간 제한이 SET XACT_ABORT ON가 열려있는 트랜잭션과의 연결 작업을 수행하는 응용 프로그램의 결과로 명시 적 트랜잭션의 모든 저장 프로 시저에 추천되기 때문에 재앙이다 .
댄 구즈의 블로그에 정말 좋은 개요가있다,
-
==============================
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.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.클라이언트 시간 초과하고이를 처리 할 수 XACT_ABORT의 사용과 관련하여, 제 생각에이하는 SqlClient 같은 클라이언트 API를에서 시간 제한을 가지고 적어도 하나의 아주 좋은 이유는, 그것은 SQL 서버 코드에서 발생하는 교착 상태에서 클라이언트 응용 프로그램 코드를 보호하는 것입니다. 이 경우 클라이언트 코드는 아무 잘못이 없습니다, 그러나 영원히 차단 명령이 서버에 완료 될 때까지 대기에서 그것을 자신을 보호 할 수 있습니다. 클라이언트 시간 제한 보호 클라이언트 코드에 존재해야한다면, 반대로, 그래서 XACT_ABORT ON은 서버 코드는 클라이언트가 기다릴 것보다 실행하는 데 시간이 더 걸리는 경우 클라이언트 중단한다에서 보호 서버 코드에있다 않습니다.
클라이언트 시간 초과하고이를 처리 할 수 XACT_ABORT의 사용과 관련하여, 제 생각에이하는 SqlClient 같은 클라이언트 API를에서 시간 제한을 가지고 적어도 하나의 아주 좋은 이유는, 그것은 SQL 서버 코드에서 발생하는 교착 상태에서 클라이언트 응용 프로그램 코드를 보호하는 것입니다. 이 경우 클라이언트 코드는 아무 잘못이 없습니다, 그러나 영원히 차단 명령이 서버에 완료 될 때까지 대기에서 그것을 자신을 보호 할 수 있습니다. 클라이언트 시간 제한 보호 클라이언트 코드에 존재해야한다면, 반대로, 그래서 XACT_ABORT ON은 서버 코드는 클라이언트가 기다릴 것보다 실행하는 데 시간이 더 걸리는 경우 클라이언트 중단한다에서 보호 서버 코드에있다 않습니다.
-
==============================
5.오류가 롤백 트랜잭션이 발생할 수 있도록 트랜잭션 관리에 사용됩니다.
오류가 롤백 트랜잭션이 발생할 수 있도록 트랜잭션 관리에 사용됩니다.
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 서버 XML 열에서 값을 조회 할 수 있습니다 (0) | 2020.03.21 |
---|---|
[SQL] SELF 무엇을 가입하고 당신이 그것을 할 때를 사용해야합니까? [복제] (0) | 2020.03.21 |
[SQL] 단지 null이 아닌 값을 선택 MYSQL (0) | 2020.03.21 |
[SQL] 항상 NVARCHAR (MAX)를 사용하는 불이익이 있습니까? (0) | 2020.03.21 |
[SQL] 다른 테이블에서 추출한 테이블 레코드에 INSERT 작업을 수행하는 방법 (0) | 2020.03.21 |