문제

MSSSQL 저장 프로 시저가 다음과 같이 보이는 분산 트랜잭션을 수행합니다.

SET XACT_ABORT ON;
SET NOCOUNT ON;

BEGIN TRY
  BEGIN DISTRIBUTED TRANSACTION


  insert into LNKSRV.INST.dbo.zz (id, val) values (1, 'a');
  insert into LNKSRV.INST.dbo.zz (id, val) values (2, 'b');


  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  if (XACT_STATE() <> 0) 
  BEGIN
    ROLLBACK TRANSACTION;
  END
  print ERROR_MESSAGE();
  print ERROR_LINE();
  print ERROR_SEVERITY();

END CATCH

이것은 잘 작동합니다.

이 세 번째 삽입 문을 추가하면 :

  insert into LNKSRV.INST.dbo.zz (id, val) values ('error', 'b');

... 올바르게 실패합니다. 트랜잭션이 원격 서버에서 롤백되고 컨트롤이 캐치 블록으로 전달되며 오류에 대한 정보를 얻습니다 ( '오류'를 int로 변환 할 수 없습니다).

그러나이 삽입 문을 추가하면 :

  insert into LNKSRV.INST.dbo.zz (id, val) values (-1, 'b');

. 거래 하다 롤백하지만 제어하십시오 하지 않습니다 캐치 블록으로 전송하십시오. 대신 실행은 단지 죽고 출력 창에 인쇄됩니다.

The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction

왜요? 캐치 블로그에 이러한 오류를 기록해야합니다.

도움이 되었습니까?

해결책

분산 트랜잭션 코디네이터가이를 처리하고 있으므로 트랜잭션의 분산 부분에서 트랜잭션이 실패하면 DTC는주의 형태로 메시지를 보내 코드가 실행되는 것을 중지하고 시도/캐치가 처리 할 수없는 것입니다.

SQL Server는 잘못된 데이터 유형을 테이블에 삽입하려고 할 때 (원격 인스턴스에서도) 링크 된 서버에서 제약 조건이 처리되므로 DTC 및 Try/에게주의를 기울여야합니다. 무시할 잡기.

자세한 내용은 SQL Server 2008 Books Online의 "Try in Transact-SQL의 Catch"섹션의 첫 번째 "참고"섹션을 참조하십시오.

http://msdn.microsoft.com/en-us/library/ms179296.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top