分散トランザクションでCATCHブロックをバイパス制約をチェック
-
23-08-2019 - |
質問
私はこのようになります分散トランザクションを実行する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」の最初の「注意」を参照してください
所属していません StackOverflow