web-dev-qa-db-ja.com

リンクサーバーが同じサーバー(localhost)をポイントしているため、「トランザクションコンテキストが別のセッションで使用されています」というエラーが発生する

SQL Server 2008を使用しています。通常、ネットワーク上に分散されたさまざまなデータベースを使用するアプリと、呼び出すストアドプロシージャの一部は、リンクサーバーを利用しています。

次に、アプリをローカルでテストして、ローカルマシンにすべてのデータベース(通常はネットワーク経由で配布される)を作成します。したがって、すべてのデータベースは現在「localhost」上に存在しています。リンクサーバーを変更して、すべてlocalhostをポイントするようにしました(また、簡単な選択テストでは、サーバーが機能していることが示されています)。

ただし、リンクサーバー(現在はlocalhostを指す)を使用するストアドプロシージャを呼び出しており、これらのプロシージャがトランザクションを使用している場合、「別のセッションで使用されているトランザクションコンテキスト」というエラーが発生します。

これはSQL Serverが分散トランザクションであると考えているためだと思いますが、実際にはローカルトランザクションですか?

ローカルインストールで接続サーバーを削除し、異なるサーバーが同じサーバー上に存在するようになったため、それらに直接対処する以外に、これを解決する可能性はありますか?

重要な場合:MS DTCを構成しなかったので、対応するWindowsサービスを自分のマシンで開始しました。 (主に、この問題を解決する場所がわからなかったためです。)

1
DotNetDeveloper

ループバックリンクサーバーは、分散トランザクションでは使用できません。問題を解決するには、ローカルに2つのSQL Serverをインストールします。あるインスタンスを別のインスタンスにリンクします。

http://msdn.Microsoft.com/en-us/library/ms188716(SQL.105).aspx

4
IvanP

これを機能させるには、マシン上に複数のインスタンスを構成する必要があります。本番環境の物理マシンである各マシンは、ラップトップ上の新しいインスタンスである必要があります。これは、ローカルマシンを参照するリンクサーバーが分散トランザクションで機能しないためです。

そして、はい、MS DTCをセットアップして正しく構成し、これらすべてを単一のマシン上の複数のインスタンスで機能させる必要があります。

3
mrdenny