質問

私はこのようになります分散トランザクションを実行する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文を追加する場合:

  insert into LNKSRV.INST.dbo.zz (id, val) values ('error', 'b');
CATCHブロックに渡されたトランザクションがリモートサーバーとコントロールにロールバックされ、私は(intに「エラー」を変換することはできません)エラーに関する情報を取得します。

-

...それは正しく失敗します。

しかし、私はこのinsert文を追加する場合:

  insert into LNKSRV.INST.dbo.zz (id, val) values (-1, 'b');
私は期待どおり

..と私はidカラムの値> 0を必要とするリモート表のチェックcontraintを持っている、そして物事は動作しません。トランザクションのDOES のロールバックが、コントロールのしないのcatchブロックに転送します。代わりに、実行はちょうど死に、これは出力ウィンドウに印刷されます:

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

なぜ?私はキャッチブログでこれらのエラーをログに記録する必要があります。

役に立ちましたか?

解決

分散トランザクションコーディネーターがこれを処理しているので、トランザクションはトランザクションの分散一部に失敗した場合、DTCがTRY / CATCHができない実行からあなたのコードを停止する注意の形でメッセージを送信し、そのプロセスます。

あなたがテーブルに正しくないデータ型を挿入しようとしているときに

SQL Serverが(でも、リモートインスタンス上で)あなたの側で検出することができますが、制約は注意がDTCに送信され、リンクサーバー上で処理され、無視されます。

あなたのTRY / CATCH

の詳細については、以下のSQL Server 2008オンラインブックのセクション「Transact-SQLの中にTRYを使用して... CATCH」の最初の「注意」を参照してください

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top