0

さまざまなMSSQL2008データベースを備えたリンクサーバーを介して分散トランザクションを開始するストアドプロシージャがあります。

を使用しております

  SET XACT_ABORT ON;

そしてまた

  BEGIN TRY / CATCH blocks

トランザクションの周囲でエラーをキャッチし、エラーコードとメッセージを呼び出し元のクライアントに返します。

ただし、分散トランザクション内のコマンドが失敗すると、MS DTCが制御を引き継いでいるようで、catchブロックは「正常に」ロールバックできず、エラーメッセージなどを返すことができません。代わりにエラーが発生します:Microsoft分散トランザクションコーディネーター(MS DTC)は分散トランザクションをキャンセルしました。(エラー1206)。

そのような分散txエラーがcatchブロックによってキャッチされる方法はありますか?

4

1 に答える 1

0

- -アップデート - -

これは既知の問題であり、Microsoft は修正しないようです: http://connect.microsoft.com/SQLServer/feedback/details/414969/uncatchable-error-when-distributed-transaction-is-aborted

回避策はありますが、SSIS を使用して SP を呼び出します


XACT_STATE() を使用してトランザクションをロールバックし、RAISERROR を @@ERROR と組み合わせて詳細を表示できるはずです。

  SET NOCOUNT ON
  SET XACT_ABORT ON
          BEGIN TRY
      BEGIN TRANSACTION

..コードはここに入る

  COMMIT TRANSACTION; 

エンド トライ
ビギン キャッチ

  DECLARE @errormsg VARCHAR(MAX)
  SET @errormsg = @@ERROR

  -- Test XACT_STATE:
      -- If 1, the transaction is committable.
      -- If -1, the transaction is uncommittable and should 
      --     be rolled back.
      -- XACT_STATE = 0 means that there is no transaction and
      --     a commit or rollback operation would generate an error.

  -- Test whether the transaction is uncommittable.
  IF (XACT_STATE()) = -1
  BEGIN
      ROLLBACK TRANSACTION;
  END;

  -- Test whether the transaction is committable.
  IF (XACT_STATE()) = 1
  BEGIN
      COMMIT TRANSACTION;   
  END;

  RAISERROR(@errormsg, 16, 1)

エンドキャッチ

于 2012-12-10T16:29:01.483 に答える