4

私は NServiceBus ソリューションを作成しており、DBSubcriptionStorage を使用しようとしています。これはデータ アクセスに NHibernate を使用し、次の例外が発生します。

パートナー トランザクション マネージャーは、リモート/ネットワーク トランザクションのサポートを無効にしました

MSDTC を有効にすることはできますが、私の質問は次のとおりです。この要件はどこから来ているのでしょうか。削除できますか?

私は NHibernate に詳しくなく、MSDTC が必要なのか、NServiceBus が必要なのかわかりません。NServiceBus サブスクリプション データベースにはフラット テーブルが 1 つしかなく、このシナリオでは MSDTC の使用はほとんど見られません。

MSDTC 要件を削除できますか? そのために、独自のサブスクリプション永続レイヤーを作成する必要がありますか?

ありがとう

4

1 に答える 1

4

MSDTC は素晴らしい小さな動物ですが、非常に陰湿な場合があります。

まず、分散トランザクションの一部になりたくないことがわかっている場合は、開発サーバーで分散トランザクションをオフにすることをお勧めします。DEV で分散トランザクションに自動的に昇格させて、実際のパフォーマンスが低下したり、運用環境で機能しないことがわかったりするのは望ましくありません。

そうは言っても、答えは NHibernate のような ORM には含まれないということですが、次の条件のいずれかが満たされている場合、MSDTC が関与する可能性は非常に高くなります。

  • 別のサーバーにリンクされているトランザクション内でビュー/テーブルをクエリしています。
  • 単一の TransactionScope 内で 2 つの SqlConnections (または NHibernate が使用するもの) を使用している
  • TransactionScope 内に別のトランザクション コンポーネント (MSMQ やトランザクション ファイル システムなど) を登録しています。

これらの条件のいずれかが満たされている場合 (確かに私が忘れていた他の条件がいくつかあります)、トランザクションは分散トランザクションに自動的に昇格し、MSDTC は必然的に関与します。つまり、MSDTC が動作してボックス用に構成されている必要があるだけでなく、トランザクションに参加するすべてのボックス用に構成されている必要があります。単純な SQL Server のシナリオでは、アプリ サーバーと SQL Server の両方が実行され、分散トランザクション用に構成されている必要があります。

私は NServiceBus に精通していませんが、たとえばキューにメッセージをトランザクション的に配置するあらゆる種類の機能を備えていると考える傾向があります。

于 2010-08-12T01:55:50.263 に答える