나는 다음과 같은 실행 한 경우이상한 행동은
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_ABORT
이 ON
때 나는 SQL Server Management Studio를
이것은 예상 한 동작과 일치합니다. 'GO'가 어떻게 작동하는지 오해 한 것일 수 있습니다. 'batch'에 대해 더 알고 싶으시면 https://msdn.microsoft.com/en-us/library/ms188037.aspx?f=255&MSPPError=-2147217396을 참조하십시오. – techspider
포인트 :'GO' does *** not *** break 거래. 트랜잭션은 일괄 처리 수준이 아닌 세션 수준 아티팩트입니다. SSMS의 'GO'는 세션이 아니라 일괄 처리를 중단합니다. – RBarryYoung