問題タブ [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.
firewall - MSDTCとファイアウォール
SQLトランザクションにはMSDTCを使用しています。MSDTCが機能するようにファイアウォールを設定する際に問題が発生しました。アプリケーションとSQLは別々のマシンで実行されています。現在、アプリケーションサーバーのファイアウォールをオフにするとMSDTCが機能します。一部のポートのファイアウォール設定に例外を追加する方法があるはずだと思います。ファイアウォールをオンのままにして、DTCに問題が発生しないようにします。ファイアウォール設定に追加するポートがわかりません(ポート135を追加しようとしましたが成功しませんでした)
msdtc - MSDTC での「リモート クライアントを許可する」および「リモート管理を許可する」とはどういう意味ですか?
一部の実稼働マシン用に MSDTC を構成しようとしていますが、すべての設定、特に [クライアントと管理] の下の [リモート クライアントを許可する] と [リモート管理を許可する] の意味を理解するのに苦労しています。
何時間も検索した後、これが私が見つけたものです:
- [DTC] の新機能... - これらの設定を除く、MSDTC セキュリティ構成ダイアログのすべての設定について説明します。
- MSDTC に関する問題のトラブルシューティング- 既定の設定と "推奨" 設定を提供しますが、それらの意味については説明しません。
これらの設定に関するヘルプをいただければ幸いです。可能であれば、これらの設定に関するドキュメントへの Microsoft のリンクを提供していただければ幸いです。
.net - Entity Framework で MSDTC を使用したプロバイダー エラー
(Entity Framework を使用して) db に保存し、1 回の保存でドキュメントを SharePoint に保存するアプリがあります。TransactionScope で MSDTC を使用しようとしています。
私の EF 挿入ロジックの一部には、外部キーのリストをデータ層に渡すことが含まれます。レイヤーは、データベースから「外部キー」オブジェクトを取得し、それをプライマリ オブジェクトに追加します。奇妙なことに、これは最初の外部キーの項目では正しく機能しますが、2 番目の項目では次のメッセージで失敗します。
System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.Transactions.TransactionManagerCommunicationException: 分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスに対して DTC を有効にしてください。
MSDTC は有効で、最初のパス スルーでは機能しますが、2 番目のパス スルーでは機能しません。複数の選択呼び出しを行っているときに、コンテキストが何らかの形で混乱していると思いますか?
ここに私の論理があります:
おそらく、データベースからオブジェクトを取得するべきではありませんか? EF でリレーションシップを参照する簡単な方法がありませんか?
.net - .NET:System.Transactionsで昇格を無効にする方法は?
分散トランザクションのサポートなしで System.Transactions プログラミング モデルを使用することは可能ですか?
何かのようなもの
sql-server - Windows 7 上の SQL Server 2008 で動的に作成された分散クエリ
複数のサーバーで統計収集を行っているだけで、テストとして、ローカルネットワーク上の自分のマシン (マシン A) と別のマシン (マシン B) で作業しています。
私のマシン (A) は、他のマシン (B) からステージング テーブル内のすべての情報を収集しています。次のようなものを実行して動的に作成するspがあります。
上記は、マシン B から 1000 行のバッチで必要な情報を取得することです。これは、すべてのデータが取得されるまでループされます。
次に別の SprocName を使用して実行すると、実際にはマシン B への呼び出しは行われず、@@rowcount が 0 と見なされて先に進みます。上記のステートメントに到達する最初の sproc のみを実行します。
疑似コード:
この方法は以前に 'select * from openquery([Machine B], 'exec SprocName @batchsize) として試したことがありますが、今回は別の方法を試していました。Servername の exec () が 1 つの sprocname だけを操作したい理由を知っている人はいますか? ループしてすべての行をプルしますが、2 番目の sprocname に移動しても、明らかにマシン B は呼び出されません。
パフォーマンス上の理由から、Servername.Table.Schema.Sproc は使用しません。
いくつかの統計:
マシン A - Windows 7 Sql Server 2008 SP1 CU がインストールされていない
マシン B - Windows 2003 Sql Server 2005 SP3 CU がインストールされていない
両方とも、XA トランザクションを除く、これに関連するほとんどすべての MSDTC オプションを持っています。
誰かが実際に私の問題を理解し、助けてくれるなら、前もって感謝します。
.net - トランザクションとmsdtcに関する混乱
トランザクションとmsdtcがどのように連携するかについて基本的な混乱があります。
基本的なサーバー/クライアントのwinformsアプリがあります。アプリはtransactionscopeを使用して、SQLサーバーで実行されるいくつかのSQLコマンドをカプセル化します。
サーバーでのみmsdtcネットワークアクセスを有効にした場合、アプリは正常に動作しているように見えました。その後、ある日、ネットワークアクセスが有効になっていないと言って動作を停止しました。
トランザクションスコープを機能させるには、クライアントコンピューターとサーバーの両方でmsdtcネットワークアクセスを有効にする必要があるようです。
クライアントまたはサーバーのmsdtcサービスはトランザクションを機能させますか?または多分その両方?
msdtcネットワークアクセスがクライアントとサーバーの両方で必要か、それともサーバーだけで必要かについてのガイダンスはありますか?
nhibernate - NServiceBusとNHibernate-メッセージハンドラーとトランザクション
私の理解では、NServiceBusはトランザクション内でIMessageHandlerのHandleメソッドを実行します。例外がこのメソッドから伝播した場合、NServiceBusはメッセージがメッセージキューに戻されるようにします(エラーキューの前にX回まで)など。つまり、いわば不可分操作があります。
NServiceBusメッセージハンドルメソッド内にいると、次のようになります。
これはトランザクションスコープにどのような影響を及ぼしますか?trans1は、Nservicebusトランザクションとの関係に関して、それらを結合するために何もしていなくても、ネストされたトランザクションとしてカウントされるようになりましたか?(そうでない場合、NServiceBusのトランザクションにどのようにリンクしますか?
2番目のブロック(trans2)を見て、throwステートメントのコメントを外すと、NServiceBusトランザクションはtrans1もロールバックしますか?基本的なシナリオでは、上記をコンソールアプリにダンプすると、trans1は独立し、コミットされ、フラッシュされ、ロールバックされません。NServiceBusのような他の誰かのトランザクションに座っているときに何が起こるかを明確にしようとしていますか?
上記は単なるサンプルコードであり、uowパターンのように、セッションを直接操作することはありません。
sql - MySQLでのMSDTC(分散トランザクション)のサポート
MySQLはMSDTCをサポートしていますか?
.net - ADO.NET Entity Framework でのトランザクションに関する MSDTC の問題
現在のプロジェクトでは、アプリケーションのデータ層として ADO.NET Entity Framework を使用しています。データベースで行う作業が多いため、トランザクションで実行する必要があるタスクがいくつかあります。これらのタスクを囲むためにTransactionScopeを使用しています。
問題は、 TransactionScopeを使用するとすぐに例外が発生することです。
System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.Transactions.TransactionManagerCommunicationException: 基になるトランザクション マネージャーとの通信に失敗しました。---> System.Runtime.InteropServices.COMException (0x80004005): COM コンポーネントの呼び出しからエラー HRESULT E_FAIL が返されました。
このエラーは、MSDTC (Microsoft Distributed Transaction Coordinator) で何らかの処理を行う必要があるようです。MSDTC のセキュリティ構成を変更すると、別の例外がスローされます。
System.Data.EntityException: 基になるプロバイダーが Open で失敗しました。---> System.Transactions.TransactionManagerCommunicationException: 分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。コンポーネント サービス管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスに対して DTC を有効にしてください。
ただし、MSDTC が構成されていると、TransactionScopeによってエラーが発生します。誰かがここで何がうまくいかないのか知っていますか?
c# - 一部のマシンでは、TransactionScope が自動的に MSDTC にエスカレートしますか?
私たちのプロジェクトでは、TransactionScope を使用して、データ アクセス レイヤーがトランザクション内でそのアクションを確実に実行するようにしています。エンド ユーザーのマシンで MSDTC サービスを有効にする必要がないことを目指しています。
問題は、半分の開発者マシンで、MSDTC を無効にして実行できることです。残りの半分は有効にする必要があります。そうしないと、"[SERVER] の MSDTC は利用できません" というエラー メッセージが表示されます。
本当に頭を悩ませており、ADO.NET トランザクション オブジェクトに基づいて自作の TransactionScope のようなソリューションに戻すことを真剣に考えています。これは正気ではないように思えます - 私たちの開発者の半分で動作する (そしてエスカレートしない) 同じコードが、他の開発者ではエスカレートします。
トランザクションが DTC にエスカレートされる理由を追跡するためのより良い回答を期待していましたが、残念ながらそうではありません。
問題を引き起こすコードのサンプル ビットを次に示します。エスカレートしようとするマシンでは、2 番目の connection.Open() でエスカレートしようとします (そして、その時点で開かれている他の接続はありません)。
私たちは本当に掘り下げて、これを理解しようとしました。これが動作するマシンに関する情報は次のとおりです。
- 開発 1: Windows 7 x64 SQL2008
- 開発 2: Windows 7 x86 SQL2008
- 開発 3: Windows 7 x64
SQL2005SQL2008
動作しない開発者:
- 開発 4: Windows 7 x64、
SQL2008SQL2005 - 開発 5: Windows Vista x86、SQL2005
- 開発 6: Windows XP X86、SQL2005
- 自宅の PC : Windows Vista Home Premium、x86、SQL2005
問題を突き止めようとして、Microsoft Update から入手できるすべてのパッチがすべてのマシンに適用されていることを付け加えておきます。
更新 1:
- http://social.msdn.microsoft.com/forums/en-US/windowstransactionsprogramming/thread/a5462509-8d6d-4828-aefa-a197456081d3/は、同様の問題について説明しています... 2006年に戻って!
- http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope%28VS.80%29.aspx - そのコード サンプルを読んでください。ネストされた 2 番目の接続 (2 番目の SQL サーバーへの、実際には) DTC にエスカレートします。 私たちのコードではこれを行っていません - 別の SQL サーバーも別の接続文字列も使用しておらず、ネストされたセカンダリ接続も開いていません - DTC へのエスカレーションがあってはなりません。
- http://davidhayden.com/blog/dave/archive/2005/12/09/2615.aspx (2005 年以降) では、SQL2000 に接続するときに DTC へのエスカレーションが常に発生する方法について説明しています。SQL2005/2008 を使用しています
- http://msdn.microsoft.com/en-us/library/ms229978.aspxトランザクション エスカレーションに関する MSDN。
MSDN のトランザクション エスカレーション ページには、次の条件によりトランザクションが DTC にエスカレートされると記載されています。
- 単一フェーズの通知をサポートしていない少なくとも 1 つの永続的なリソースが、トランザクションに登録されています。
- 単一フェーズの通知をサポートする少なくとも 2 つの永続的なリソースが、トランザクションに登録されます。たとえば、単一の接続を登録しても、トランザクションは昇格されません。ただし、データベースへの 2 番目の接続を開いてデータベースを参加させると、System.Transactions インフラストラクチャは、それがトランザクション内の 2 番目の永続的なリソースであることを検出し、MSDTC トランザクションにエスカレートします。
- トランザクションを別のアプリケーション ドメインまたは別のプロセスに「マーシャリング」する要求が呼び出されます。たとえば、アプリケーション ドメインの境界を越えたトランザクション オブジェクトのシリアル化です。トランザクション オブジェクトは値によってマーシャリングされます。つまり、アプリケーション ドメインの境界を越えて渡そうとすると (同じプロセスであっても)、トランザクション オブジェクトがシリアル化されます。Transaction をパラメーターとして受け取るリモート メソッドで呼び出しを行うことによって、トランザクション オブジェクトを渡すことができます。または、リモート トランザクション サービス コンポーネントへのアクセスを試みることができます。これにより、トランザクション オブジェクトがシリアル化され、アプリケーション ドメイン全体でトランザクションがシリアル化される場合と同様に、エスカレーションが発生します。これは分散されており、ローカル トランザクション マネージャーはもはや適切ではありません。
私たちは#3を経験していません。#2は、一度に1つの接続しかなく、単一の「永続的なリソース」に対しても接続されるため、発生していません。#1が起こる方法はありますか?単一フェーズ通知をサポートしない原因となる SQL2005/8 構成はありますか?
更新 2:
個人的に、全員の SQL Server バージョンを再調査しました。「Dev 3」には実際には SQL2008 があり、「Dev 4」には実際には SQL2005 があります。同僚を二度と信用しないように教えてくれます。;) このデータの変更により、問題が見つかったと確信しています。SQL2008 には、SQL2005 にはない大量の素晴らしい機能が含まれているため、SQL2008 の開発者はこの問題に直面していませんでした。
また、SQL2005 をサポートする予定であるため、これまでのように TransactionScope を使用することはできず、TransactionScope を使用したい場合は、単一の SqlConnection オブジェクトを渡す必要があることもわかります...これは、SqlConnection を簡単に渡すことができない状況では問題があるようです...グローバル SqlConnection インスタンスのにおいがするだけです。ピュー!
アップデート 3
ここで質問を明確にするために:
SQL2008:
- 1 つの TransactionScope 内で複数の接続を許可します (上記のサンプル コードで示されているように)。
- 警告 #1: これらの複数の SqlConnections がネストされている場合、つまり、2 つ以上の SqlConnections が同時に開かれている場合、TransactionScope はすぐに DTC にエスカレートします。
- 警告 #2: 追加の SqlConnection が別の「永続的なリソース」 (つまり、別の SQL Server) に対して開かれると、すぐに DTC にエスカレートされます。
SQL2005:
- 1 つの TransactionScope 期間内に複数の接続を許可しません。2 番目の SqlConnection が開かれるとエスカレートします。
更新 4
この質問をさらに便利にするために、そしてより明確にするために、SQL2005を単一の SqlConnection
.
SqlConnection.Open()
これは私には壊れているように見えますが、へのすべての呼び出しが接続プールから取得されている かどうかは理解できると思います。
「しかし、なぜこれが起こるのでしょうか?」 接続が開かれる前にその接続に対して SqlTableAdapter を使用すると、SqlTableAdapter は接続を開いたり閉じたりして、トランザクションを効果的に終了します。
したがって、基本的に、SQL2005 で TransactionScope を正常に使用するには、最初の TransactionScope がインスタンス化されてから不要になるまで、何らかのグローバル接続オブジェクトを開いたままにしておく必要があります。グローバル接続オブジェクトのコード臭に加えて、最初に接続を開いて最後に閉じることは、接続をできるだけ遅く開き、できるだけ早く閉じるというロジックに反します。