問題タブ [msdtc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - MSDTC での WCF Windows サービスの問題
2008 アプリケーション サーバーで実行されている msmq を使用する .net 3.5 Windows サービスがあります。このサービスは、データベース サーバー上の SQL 2005 データベースと通信します。
2008 Web サーバーの aspx ページからこのサービスを呼び出すと、以下のエラーが発生します。
「分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスの DTC を有効にしてください。トランザクション マネージャーは、リモート/ネットワーク トランザクションのサポートを無効にしました。(HRESULT からの例外) : 0x8004D024)」
この指示に従いましたが、うまくいきませんでした。
コードをデバッグすると、ExecuteNonQuery メソッドを使用してストアド プロシージャを実行しようとしている Windows サービス コードの行で上記のエラーがスローされます。
ここで何が欠けていますか?
参考までに、Web サーバー上の私の web.config は次のようになります。
msdtc - 分散トランザクションコーディネーター
複数のシステムでデータベーストランザクション(レコードの挿入)を行おうとしています。そこで、.netでSystem.Transaction名前空間を使用することにしました。両方のシステムでMSDTCを構成しました(ただし、正しく構成したかどうかはわかりません)。私のトランザクションには2つの挿入クエリがあり、1つはローカルシステムで実行されます。もう1つは、ローカルネットワーク内の他のシステムで実行されます。最初の挿入クエリは正常に機能しますが、2番目の挿入クエリは次のようなエラーを発生させます。メッセージ="トランザクションはすでに暗黙的または明示的にコミットまたは中止されています。"
これが私のコードです
c# - どのような状況で、SQLレプリケーションはac#アプリケーションからのMSDTCトランザクションから部分的に(そしてサイレントに)失敗しますか?
特に奇妙な問題があります。シーンを設定させてください。見つかった解決策は以下を参照してください
議論のために、 Alpha、Beta、Gammaの3つのSQLServer2005データベースがあります。
これらのデータベース間には、次のように複製関係が定義されています。
3つのデータベースすべてに、同じスキーマを持つ「AnExample」という名前のテーブルがあります。レプリケーションは、 Alphaがプロバイダーであり、他の2つのデータベースがサブスクライバーであるように設定されています。
- MSDTCトランザクション(TransactionScopeによって処理される)を使用するc#.Net 3.5アプリケーションは、データベースの読み取りと書き込みの両方を行います:アルファ版とベータ版。
- このトランザクション内のテーブル「AnExample」は、Alphaでのみ更新されています。
- MSDTCトランザクションは正常にコミットします。
- 「AnExample」テーブルはおそらくAlphaで更新され、変更はすぐにGammaに複製されます。
- ベータ版では変更は発生しません(プロファイラーはデータベースでアクティビティが発生しないことを確認します)。また、SQLログまたはイベントログでエラーが発生することもありません。
- 同じクレデンシャルでManagementStudioの「AnExample」を更新する同じクエリを再実行すると成功します(ベータ版へのレプリケーションが発生します)
- MSDTCトランザクションの実行ベータ版で別のテーブルに書き込み、次にメインアプリケーションのDAL、接続文字列、および構成を使用したテストアプリケーションを使用したAlphaの「AnExample」テーブルへのまったく同じ書き込みも完全に成功します(ベータ版へのレプリケーションが発生します)
これにより、メインアプリケーションには、単独では発生しない変更が発生していると思われます。
考えられる手がかり/赤いニシン
成功したテストとメインアプリケーションが使用する実際のクエリとの唯一の違いは、分離レベルが何らかの形で変更されていることです。成功したクエリでは、トランザクション分離レベルは読み取りコミットのみに設定されますが、失敗したシナリオではシリアル化可能に設定されます(コードベースまたはストアドプロシージャにある分離レベルを変更する明示的な呼び出しはありません)。
Management Studioでこの分離レベルを使用してクエリを実行すると、問題なく成功するため、これはやや厄介な問題だと思います。しかし、これがまだ発見されていない別の問題の症状である可能性があるという点は異なります。
完全を期すために、ベータ版への複製に失敗する(ただしガンマへの複製は行う)クエリの設定を示します。
それは少し頭を悩ませています。
.net - TransactionScopeとMSDTCを使用したVSデータベースの単体テストが失敗するのはなぜですか?
コミットされていないTransactionScopeを使用するDatabaseTestFixtureクラスを使用して、SQL Server 2000データベースに対していくつかの単体テストを実行しているため、すべての変更がロールバックされます。テストはローカルデータベースに対して問題なく実行されました。
次に、単体テストを共通のデータベースサーバーに向け、単体テストを実行しているマシンにMSDTCをセットアップしました。すべて、そのマシンで問題ありません。
これで、同じ共通データベースに対しても単体テストを実行する新しいマシンをセットアップしました。このマシンでは単体テストが実行されないため、次のエラーが発生します。
System.Transactions.TransactionException:トランザクションはすでに暗黙的または明示的にコミットまたは中止されています。
MSDTCの設定は、機能している設定とまったく同じです。画面ごとに比較しました。
誰かが以前にこのようなことを経験したことがありますか?または、何が原因であるかについての手がかりを探す場所についての指針を得ましたか?
Windowsのバージョンとサービスパック、ファイアウォールオプション、msdtcオプション、VSバージョンとサービスパックを確認しました。
transactions - MSDTC (分散トランザクション コーディネーター) の初回起動が遅い
非常に単純な分散トランザクションは、最初の実行で完了するまでにかなりの時間 (3 ~ 4 秒) かかることに気付きました。しかし、同じトランザクション スコープが再度呼び出されると、はるかに高速になります (30 ミリ秒)。MSDTC は 1 時間後にスリープ状態になるようです。1 時間が経過すると、次のトランザクションの実行に 3 ~ 4 秒かかります。
サイトのトラフィックはそれほど多くないと思うので、個々の取引の間に何時間もかかる可能性があります。
おそらくこれは、MSDTC サービスが手動で開始するように設定されているためだと思いましたが、MSDTC サービスが両方とも自動的に実行されていることを確認しました。
どこかにレジストリ設定があると思いますが、MSDN で何かを見つけることができませんでした。
ありがとうございました!
.net - 異なるデータベース接続にまたがる複数の SQL トランザクション コマンド
アプリケーションに .NET 2.0/3.5 フレームワークを使用しています。複数の接続でいくつかの SQL コマンドを実行する必要があり、各接続は異なるサーバー (Oracle、SQL Server) 上にあります。これらのコマンドがトランザクション対応であることを確認する必要があります。
例: Oracle データベースと SQL Server データベースの両方のテーブルで INSERT を実行し、例外がスローされなかった場合はそれらをコミットする必要があります。例外があった場合、必要に応じて両方のサーバーでロールバックしたいと考えています。
System.Transactions と TransactionScope を使用する必要があると思います。これには、データベース サーバーとアプリケーション サーバーに Microsoft Distributed Transaction Coordinator (MSDTC) をセットアップする必要があります。
高低を調べましたが、相互認証を使用して MSDTC を段階的にセットアップする方法 (ファイアウォール設定と MSDTC 設定の構成を含む) を説明している記事を見つけることができませんでした。完全に文書化されています (セットアップ方法に関する非常に優れた MSDN 記事を見つけられない限り)。
MSDTC を使用することが私の仕事を成し遂げるための唯一の方法ですか?
もしそうなら、どうすれば正しく設定できますか?
編集:
- すべてのマシンで Windows Server 2003 を使用しています。
- 2 つの SQL Server があります。1 つは SQL Server 2000 で、もう 1 つは 2005 です。
- Oracle サーバーが 1 つあり、バージョン 11g です。
- 私たちが開発しているアプリケーションは、トランザクション方式で 3 つのデータベースすべてのレコードを変更/作成する必要がある場合があります。
- キーボードと椅子の間の問題ではありません。MSDTC に関するすべての設定方法に関する MSDN の記事を読みましたが、DTCPing やその他のテスト アプリケーションを動作させることができません。プロセスの詳細を段階的に説明する記事を探していました。特定のことを行うための手順を「省略」している MSDN ドキュメントに何度か遭遇しました。
security - MSDTC には固有のセキュリティ リスクがありますか?
MSDTC を有効にすることに関連する一般的なセキュリティ リスクはありますか?
チーム メンバーの 1 人から、それを有効にするとセキュリティ リスクがあると言われたが、もしあれば、それが何であるかを知りたい.
asp.net - 分散トランザクションが完了しました。このセッションを新しいトランザクションまたは NULL トランザクションに参加させる
他の誰かがこの特定のエラーを抱えていて、それを解決する方法を知っているかどうかだけ知りたいですか?
シナリオは次のとおりです...
SQL Server 2008 クラスター バックエンドに接続する Windows Server 2008 IIS ファームで実行されている Enterprise Library を使用する ASP.NET Web アプリケーションがあります。MSDTC がオンになっています。DB 接続はプールされます。
私の疑惑は、どこかで MSDTC トランザクションが失敗し、接続がプールに返され、別のページの次のクエリが不正な接続を取得して、この特定のエラーが発生したことです。おもしろいのは、分散トランザクションをまったく必要としないクエリでこのエラーが発生したことです (2 つのデータベースへのコミットなど)。エラーが発生したとき、選択クエリ (トランザクションなし) のみを実行していました。
SQL プロファイリングを実行し、クエリは SQL Server で実行されましたが、返されませんでした (接続で MSDTC トランザクションが既に中止されたため)。
これに伴うその他の関連エラーは次のとおりです。
- 有効なトランザクション記述子が必要なため、新しいリクエストを開始することはできません。
- 内部 .Net Framework データ プロバイダー エラー 60。
sql-server - MSDTC-安全な接続を確立しようとしたときにエラーが発生しました(スタンドアロン)
まず、これが可能かどうかはわかりませんが、私のシナリオについて説明します。
一連のWCFサービス、SQL Server2008データベースがすべてWindowsServer2008で実行されています。LANに接続している場合、これらはすべて正常に機能しますが、このボックスをデモに使用します。スタンドアロンモードで動作させるため(つまり、どのネットワークにも接続されていない場合)。
スタンドアロンモードでこれを実行しようとすると、SQL Serverデータベースが機能しているように見えます(データを取得できます)。ただし、WCFサービスからトランザクションスコープ内にデータを挿入しようとすると、クライアント側で通信障害の例外が発生します。Windowsのイベントログを確認すると、「システムとの安全な接続を確立しようとしたときに、MSDTCでエラーが発生しました」というメッセージが表示されます。
これを機能させるためにDTCに何を設定する必要があるかを誰かが知っていますか
c# - 最初のトランザクションで MSDTC が失敗する
データを取得して 1 日に 1 回データベースに格納するアプリケーションがあります。最近まで、このアプリケーションは SQL サーバーと同じマシンに常駐していましたが、必要な周辺機器の一部にハードウェアの問題があるため、Windows XP を実行する別のマシンに移動されました。
ここでの問題は、朝の最初のトランザクションが実行されると、次のスタック トレースを受け取ることです。
System.Transactions.TransactionManagerCommunicationException: 基になるトランザクション マネージャーとの通信に失敗しました。---> System.Runtime.InteropServices.COMException (0x80004005): COM コンポーネントの呼び出しからエラー HRESULT E_FAIL が返されました。
ただし、すぐにトランザクションを再実行すると成功します。MSDTC が最初のトランザクションに応答するのに時間がかかりすぎて失敗しているように見えますが、2 番目のトランザクションの準備ができています。インターネット上でこれが発生していることについての言及をいくつか見つけましたが、実際の解決策は見つかりませんでした。誰かがこれに遭遇しましたか?その場合、MSDTC がメモリからアンロードされないようにする方法はありますか、またはタイムアウトを延長するなどの別の解決策はありますか?