1

背景: .NET Framework 2.0 で開発された Web サイトがあり、Sql Server 2005 で作成されたデータベースを使用しています。また、.NET Framework 4.0 で開発された Web サイトもあり、これは Sql Server 2008 で作成されたデータベースを使用しています。 . 両方のデータベース (Sql Server 2005 から Sql Server 2008 へ) をリンクして、「Sql Server 2005 データベースのリンク サーバー」を作成しました。

シナリオ: Sql Server 2005 でホストされているデータベースにレコードを作成すると、トランザクションのシーケンスは次のようになります。 Sql Server 2005 データベースでホストされているテーブルにレコードを挿入します。この挿入は、挿入後にトリガーを実行します。トリガー内で、ストアド プロシージャ (Sql Server 2008 データベースでホストされている) を実行します。このストアド プロシージャは、「リンクされたサーバー」を使用して実行されます。このストアド プロシージャは、Sql Server 2008 データベースでホストされているテーブルへの挿入を実行します。Sql Server Management Studio 2005 を使用して、Sql Server 2005 データベースでホストされているテーブルへの挿入を手動で実行すると、すべてがうまく実行されますが、Web サイト (.NET 2005) の UI を使用してレコードを作成しようとすると、このエラー:

現在のトランザクションをコミットできず、ログ ファイルに書き込む操作をサポートできません。トランザクションをロールバックします。Microsoft 分散トランザクション コーディネーター (MS DTC) が分散トランザクションをキャンセルしました。

誰が何が起こっているのか知っていますか?

4

1 に答える 1

0

そのようなコードをトリガーで実行するのは非常に危険です。トリガーを削除し、説明されているアクションを実行するプロシージャを作成することを検討します。

また、すべてを正しくテストするには、両方のサーバーで 1 つのトランザクションで DML アクションを呼び出すか、「begin distributed tran」を呼び出して分散トランザクションを明示的に開始する必要があります。他のサーバーで何かを更新しただけの場合 (アクションは 1 つだけ)、分散トランザクションを使用しておらず、テストが正しくありません。

于 2012-07-17T05:48:18.183 に答える