SQL Server 2014를 사용하고 있으며 ID 및 데이터라는 varchar 열이있는 테이블이있는 간단한 데이터베이스가 있습니다.SP_ExecuteSQL을 사용할 때 트랜잭션이 깨졌습니다.
SET XACT_ABORT ON
BEGIN TRANSACTION
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
SSMS 내가 sp_executesql
호출에 잘못된 쿼리를 실행하려고하기 때문에 오류가 있음을 보여줍니다 : 나는 다음 문을 실행 몇 가지 이상한 행동이있다. 그러나 1 row(s) affected
도 표시됩니다. testTable에서 select 쿼리를 실행하면 값 'b'가 삽입 된 것을 볼 수 있습니다. 나는 TRY/CATCH
블록 모든 일에 문을 포장하는 경우
기대 작품으로, 전체 트랜잭션 작업은 롤백 :
BEGIN TRANSACTION
BEGIN TRY
exec sp_executesql N'some nonsense'
insert into testTable values ('b')
COMMIT
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
ROLLBACK
END CATCH
SET XACT_ABORT ON
뭔가가가는 경우 전체 트랜잭션이 롤백되도록 안 잘못된? 제가 놓친 세팅이 있습니까?
감사
TRY
/
CATCH
에 싸여 있지 않은 런타임 구문 오류도
ON
-
XACT_ABORT
세트, 활성 트랜잭션을 중단하지 않기 때문에이 문제가 발생
'어떤 넌센스가 무엇인지에 달려있는 것처럼 보입니다. 컴파일 시간 오류 인 경우 말처럼 행동합니다. 런타임 오류 ('exec sp_executesql N'SELECT 1/0 ''과 같은) 인 경우 원하는 방식으로 동작합니다. –
좋아, 나는 그것이 차이를 만들지 몰랐다. 구문 오류가있어서 설명 할 수 있습니다. 그러나 이것이 왜 그렇게하는지 설명하는 문서가 있습니까? 나는 여전히 전체 트랜잭션이 컴파일 타임 오류 일지라도 롤백 될 것으로 기대합니다. 또는 XACT_ABORT 옵션은 런타임 오류 만 처리합니까? – Pinetree
이전에는이 동작을 알지 못했습니다. 그것이 "설계 상"인지 아닌지 나는 모른다. –