2016-06-14 1 views
3

나는 다음과 같은 실행 한 경우이상한 행동은

SET XACT_ABORT ON; 

BEGIN TRANSACTION 
INSERT INTO t2 VALUES (1) 

INSERT INTO t2 VALUES (2) -- Foreign key error, entire transaction rolled back 

INSERT INTO t2 VALUES (3) 

COMMIT TRANSACTION 

후 아무것도 확인입니다; 트랜잭션은 t1에서 값 2가 없기 때문에 롤백됩니다. 결과적으로 테이블 t2는 비어 있습니다.

그러나이 트랜잭션 중간에 GO 명령을 추가하면 트랜잭션이 롤백되지 않고 번호 3 테이블 t2에 삽입됩니다.

SET XACT_ABORT ON; 

BEGIN TRANSACTION 
INSERT INTO t2 VALUES (1) 

INSERT INTO t2 VALUES (2) -- Foreign key error. 

GO --this command breaks the transaction 

INSERT INTO t2 VALUES (3) 

COMMIT TRANSACTION 

내가 GO는 SQL 문하지만 실제로 SQL 서버로 전송되지 않습니다 오히려 SQL Server Management Studio의 유틸리티 명령 아니라는 것을 알고 여기에 코드입니다.

그래서, (GO 명령을 포함하는 하나) 위의 마지막 코드를 실행 한 후 나는 SET XACT_ABORTON 때 나는 SQL Server Management Studio를

+1

이것은 예상 한 동작과 일치합니다. 'GO'가 어떻게 작동하는지 오해 한 것일 수 있습니다. 'batch'에 대해 더 알고 싶으시면 https://msdn.microsoft.com/en-us/library/ms188037.aspx?f=255&MSPPError=-2147217396을 참조하십시오. – techspider

+2

포인트 :'GO' does *** not *** break 거래. 트랜잭션은 일괄 처리 수준이 아닌 세션 수준 아티팩트입니다. SSMS의 'GO'는 세션이 아니라 일괄 처리를 중단합니다. – RBarryYoung

답변

8

을 사용

테이블 T2에서 숫자 3을 볼 수있는 이유 Transact-SQL 문에서 런타임 오류가 발생하면 전체 트랜잭션이 종료되고 롤백됩니다.

첫 번째 일괄 에서 열린 트랜잭션이 자동으로 얻을 다시 오류에 압연 않습니다.

그런 다음 SSMS 첫 번째 트랜잭션은 지금이 새로운 자동 트랜잭션을 커밋 시작 폐쇄됨에 따라

INSERT INTO t2 VALUES (3) 

COMMIT TRANSACTION 

떨어져 다른 처리 배치 및 화재가 본다. 그리고 결국에는 예기치 않은 COMMIT TRANSACTION이 발생하여 오류가 발생합니다.

첫 번째 일괄 처리의 트랜잭션이 비정상적으로 롤백되었는지 확인하기 위해 두 번째 일괄 처리를 변경할 수 있습니다.

SET XACT_ABORT ON; 

BEGIN TRANSACTION 
INSERT INTO t2 VALUES (1) 

INSERT INTO t2 VALUES (2) -- Foreign key error. 

GO 

IF @@TRANCOUNT = 0 
    BEGIN 
    RAISERROR('Transaction closed',16,1); 
    RETURN; 
    END 

INSERT INTO t2 VALUES (3) 

COMMIT TRANSACTION 

가 아니면 SQLCMD 모드를 설정하고 더 배치 오류 후 처리되지하려면

:on error exit 

를 사용할 수 있습니다.

enter image description here

+0

나는이 답변과 인라인 관계에 있지만 OP는 롤백되는 대신 GO 후에 테이블에서 '2'를 볼 수 있다고 말합니다. 나는 OP가 질문에 대해 확실한 지 조금 혼란 스러웠다. :) – techspider

+4

언제나처럼 자리 잡는다. – RBarryYoung

+0

예, 테이블 2에서 2 번을 볼 수 있습니다. 이것이 문제입니다. 코드/붙여 넣기 코드를 복사하고 시도해보십시오. – Christian