問題タブ [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# - TransactionScopeを使用した例外「操作はトランザクションの状態に対して有効ではありません」
サーバー #1 に Web サービスがあり、サーバー #2 にデータベースがあります。Web サービスは、トランザクション スコープを使用して分散トランザクションを生成します。すべてが正しいです。
そして、サーバー #3 に別のデータベースがあります。このサーバーに問題があり、オペレーティング システムとソフトウェアを再インストールしました。MSDTC を構成し、サーバー #1 の Web サービスを使用して、このサーバー上のデータベースと通信しようとしました。そして、トランザクション スコープ内の最初の select ステートメントの後、次のようになりますThe operation is not valid for the state of the transaction
。この例外は、トランザクション スコープを使用している場合、すべての Web サービス リクエストに当てはまります。サーバー #2 とサーバー #3 はほぼ同じです。違いは設定だけです。.NET Framework 3.5 SP1 がインストールされ、すべてのサーバーに SQL Server SP3 がインストールされています。
完全なスタック トレース:
System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) в System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) в System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction t в System.Data.SqlClient.SqlInternalConnection .Enlist(Transaction t × System.Data.SqlClient.SqlInternalConnectionTds.Activate(トランザクション トランザクション) × System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(トランザクション トランザクション) × System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) × System. Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) в システム。Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) v System.Data.SqlClient.SqlConnection.Open() v NHibernate.Connection.DriverConnectionProvider.GetConnection() v NHibernate.Impl.SessionFactoryImpl.OpenConnection()
このメッセージを検索しましたが、適切な解決策が見つかりませんでした。では、どの設定を確認する必要があり、それを修正するには正確に何をすればよいでしょうか?
asp.net - トランザクションが昇格する原因を見つけるにはどうすればよいですか?
主にLINQtoSQLとSystem.Transactionsを使用するWebサービス(.asmxとWCFの混合)を提供するWebサイトがあります。時折、トランザクションが分散トランザクションに昇格し、MSDTCを使用できないようにWebサーバーがデータベースから分離されているために問題が発生することがあります。
web.configに以下を追加して、System.Transactionsのトレースを構成しました。
これは非常に興味深いものであり、トランザクションがプロモートされたときに表示されますが、その理由を見つけるのに実際には役立たないことがわかりました。
プーリングに影響を与える変数(ユーザー、cnn文字列、トランザクションスコープ)など、接続が作成されたときに表示されるADO.NETの同等のトレースメカニズムはありますか?
windows - Windows 7 - ネットワーク DTC アクセスを有効にする
TransactionScope クラスを使用してトランザクションを開始する Visual Studio 2010 Windows フォーム アプリケーションがあります。次に、正常に動作する Sql Server Broker Services メッセージ キューからメッセージを受信します。次に、Visual Studio データセット (xsd ファイル) であるデータ アクセス レイヤーを呼び出して、同じデータベースからストアド プロシージャを呼び出そうとします。データベースに対してこの 2 回目の呼び出しを行うと、次のエラー メッセージが表示されます。
通信の問題により、MSDTC トランザクション マネージャーはソース トランザクション マネージャーからトランザクションを取得できませんでした。考えられる原因は次のとおりです。ファイアウォールが存在し、MSDTC プロセスの例外がない、2 台のマシンが NetBIOS 名で互いを検出できない、またはネットワーク トランザクションのサポートが 2 つのトランザクション マネージャーのいずれかで有効になっていない。(HRESULT からの例外: 0x8004D02B)。
dcomcnfg.exe を介して DTC アクセスを有効にし、Windows ファイアウォールを介して DTC が通信できるようにすることに関する Web 上の投稿をいくつか見ました。私はそれらのことをしましたが、まだこの問題を抱えています。Windows XP および Vista 上の Visual Studio 2008 で構築された他のプロジェクトで同様のトランザクションを使用しているため、リモート データベース サーバーが DTC アクセスを有効にするようにセットアップされていることはわかっています。Windows 7 と Visual Studio 2010 に固有の何かがこの問題を引き起こしていると思いますが、それが何であるかを見つけることができませんでした。誰でもこの問題を解決できますか?
この問題を抱えている別のプログラマー ( http://www.pcreview.co.uk/forums/thread-3977150.php )からの Web 上の投稿を見たところです。 Windows 7 - x64 でのエラー。Windows 7 の x64 バージョンを実行していますが、Windows 7 の 64 ビット バージョンで MSDTC に問題があるかどうかを知っている人はいますか?
c# - MSDTC がクライアント マシンを分散トランザクションに参加させようとする
MSDTC によって記録された次の断続的な警告が表示されます。
呼び出し元がトランザクションをリモート システムに伝達しようとしましたが、マシン 'X' で MSDTC ネットワーク DTC アクセスが現在無効になっています。MS DTC 構成設定を確認してください。
ただし、マシン X では MSDTC が設計上無効になっています。これはクライアント マシンであり、トランザクションに参加するビジネスはありません。
- TCP 経由で WCF サービスをホストする複数の Windows サービス エンドポイント
- 下にある単一の SQL Server 2005 インスタンス
- Linq から SQL へ
- リモート クライアントが WCF/TCP 経由でイベント コールバックを受信する
この問題は再現が難しく、通常はサービスの再起動後に発生します。クライアント マシンへのコールバックがトランザクションのコンテキスト内で発生していると思われます。
誰かが同様の問題を見たのだろうか??
ケン
c# - Entity Framework を使用した MSDTC と複数のデータベース
私のコードでは、Entity Framework で TransactionScope を使用してトランザクションを使用しようとしています。このトランザクションでは、別のサーバーとデータベースへの通常の SQL 接続を開いています。conn.Open() が呼び出されると、エラーが発生します。
「分散トランザクション マネージャー (MSDTC) のネットワーク アクセスが無効になっています。Componet Services 管理ツールを使用して、MSDTC のセキュリティ構成でネットワーク アクセスの DTC を有効にしてください。」
ただし、MSDTC が有効になっており、サーバー上で実行されています。
sql-server - MSSQL2008: DTC トランザクション - 内部アボート
私は小さな独自のレプリケーションを作成します-別のサーバーへの DTC INSERT を起動するトリガー (私自身の "レプリケーション" の 1 つの理由: トリガーの実行中にデータを計算し、別の理由: 高速バージョンから高速バージョンまで動作します)。
Windows認証を使用して同じホストから最初の挿入を行うと、正常に機能します。ただし、別のホストに Web サーバーがあり、sqlserver ログインを使用します (sa のテスト用)。このホストが最初の挿入を行うと、DTCTransaction EventClass (プロファイラー) での登録および作成フェーズの後に、内部アボートが発生します。
魔法は次のとおりです。Windows認証を使用して同じホストから最初に起動すると、Webサーバーから起動でき、正常に動作します。しかし、私は数分待たなければならず、うまくいきません。
推論のどこに誤りがありますか?
これが私の最初のサーバースクリプトです:
アップデート:
ある SQL サーバーから別の SQL サーバーにいくつかの統計テーブルを供給したいと考えています。これを行うために同じトリガーを書きました。同時に、トリガーでいくつかの追加データを呼び出し、それを 2 番目のデータベースに書き込むので、標準のレプリケーションは使用できません。
このコードを使用してリンク サーバーを作成しました。
EXEC master.dbo.sp_addlinkedserver @server = @Servername, @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = @Servername、@locallogin = NULL、@useself = N'False'、@rmtuser = @Serverlogin、@rmtpassword = @Serverpwd
私のトリガーは次のようになります。
トリガーを起動する挿入のイニシエーターが「Windows 認証」を使用する場合、これはうまく機能します。
「SQLサーバー認証」を使用すると問題が発生します。これは、Apache Tomcat Webサーバーに必要です。
SQL Server プロファイラーを調べると、DTCTransaction EventClass が返されます
「Windows認証」を最初に実行すると、次の数分で「SQLサーバー認証」を使用して挿入を正常に実行できます。少し待つと、同じエラーが発生します。
したがって、私の最初の解決策は、トリガーを WITH EXECUTE AS OWNER に変更することでした
「SQLサーバー認証」を使用してローカルマシンから挿入を実行すると、これは機能しますが、別のサーバーからは機能しません。ただし、別のサーバーからも機能するはずです。
.net - SQL Server および TransactionScope (MSDTC を使用): 散発的に接続できない
SQL Server への呼び出しを呼び出す .net コードのテストをいくつか作成しました。結果として生じるデータベースへの変更をロールバックするには、使用System.Transactions
が優れた選択肢のようです。一部の純粋主義者がデータベースをモックしたいと提案することは承知していますが、私はその道をたどりません。これは厳密に純粋な単体テストではありません。
いくつかのテストを作成して実行すると、これは期待どおりに機能します。テスト セットアップ メソッドとテスト ティアダウン メソッドで、.net トランザクションを初期化および中止するためのコードを単純に記述しました。それは素晴らしい解決策のように思えました。
しかし、私が抱えている問題は、これらのテストを 100 回実行しようとすると、それらの多くが、1 つずつ実行すると合格したにもかかわらず、SQL Server に接続できないという例外をスローすることです。さらに悪いことに、テストを実行すると、データベース内のテーブルが散発的にロックされることがあります。ロックを手動で削除するよう DBA に依頼する必要があります。
多くの人が知っているように、SQL サーバーに対して (このテストを実行する場合のように) 開発ワークステーションで実行されるコードで TransactionScope を使用すると、.net フレームワークで MSDTC が使用されます。
私がやっていることを説明するためのコードサンプルは次のとおりです。
ご覧のとおり、ここには特に派手なものはありません。メソッドで見つけたいものをデータベースに書き込むテストメソッドがあります。これはほんの一例です。このようなテストは他にもたくさんあります。
私のテストの論理は正しいようです。テストが失敗するだけでなく、散発的にユーザーをテーブルからロックアウトする原因は何ですか?
sql-server - SQL Server ミラーリングと自動フェールオーバーを使用している場合、MSDTC がサポートされないのはなぜですか?
SQL Server ミラーリングをサポートしたいアプリケーションがあります。ただし、アーキテクチャは現在、複数の WCF サービスと DB 接続が 1 つの MSDTC トランザクションに参加するようなものであり、ミラーリングを使用する場合、Microsoft は MSDTC がサポートされていないと述べています。
彼らの説明はあまり有益ではありません:
MS DTC トランザクションでデータベース ミラーリングを使用すると、同様のシナリオが発生する可能性があります。たとえば、新しいプリンシパル サーバーは、フェールオーバー後に MS DTC に接続します。ただし、MS DTC は新しいプリンシパル サーバーを認識しません。したがって、MS DTC は、トランザクションが他のデータベースでコミットされたと見なされる場合でも、"コミットの準備" フェーズにあるすべてのトランザクションを停止します。
私が理解に問題を抱えているのは、最後の文です。これは、DB サーバーがミラーリングされておらず、同じ時点で停止した場合とどう違うのでしょうか? 誰かが私にそれを説明できますか?これを組織内の他のユーザー (および顧客) に説明できるようにする必要がありますが、MSDTC が 1 つのシナリオで適切にロールバック/補正できる理由がわかりませんが、参加者の 1 つがミラーリングされた SQL サーバーである場合はできません。 (フルセーフティモード)。
.net - MSDTC なし - 「基になるトランザクション マネージャーとの通信に失敗しました」というメッセージが引き続き表示される
私のプロジェクトでは、Ado.Net の DbTransaction オブジェクトを使用してトランザクションを管理しています...次に、MSDTC 関連のエラーが発生する理由 - 「基になるトランザクション マネージャーとの通信に失敗しました」。
これが私のコードです。
sql-server - 分散トランザクションは、Windows インストーラ カスタム アクションでデータベース アップグレードのロールバックを有効にするのに適していますか?
私は WiX で利用できる Sql Server カスタム アクションを使いこなせなくなったので、Deployment Tools Foundation を使用して独自のアクションを作成するという大胆な一歩を踏み出しました。私は良き市民になりたいと思っています。しかし、それを行う最良の方法は何ですか?
SQL Server 2005 以降のすべてのエディションをサポートする必要があります。
問題は、Windows Installer が 2 つのフェーズで動作することです。作業を実行し、元に戻す情報を保存します。次に、すべてのピースが配置されると、コミット (元に戻す情報を削除) するか、ロールバックを実行します。
これは、標準的なトランザクションが機能しないことを意味します。それらは私の Execute カスタム アクション内で完了する必要があり、後でロールバックする機会がありません。
必要に応じてロールバック アクションで復元できるデータベースのコピーのみのバックアップを作成することを検討しましたが、単純な方法には欠点があると思います。たとえば、データベースがどのくらい大きくなるかはわかりません。そのため、ターゲット マシンにバックアップを保持するための空き容量があるかどうかは保証できません。また、バックアップと復元が完了するまでに時間がかかる場合があり、通常のインストール (ロールバックが発生しない場合) が不必要に遅くなることは望ましくありません。
つまり、分散トランザクション コーディネーターが起動していることを確認し、変更を行う前に分散トランザクションを初期化し、適切なカスタム アクションでコミットまたはロールバックします。
TransactionInteropクラスのメンバーを使用して、異なるカスタム アクション間でトランザクションを共有できるようにする Cookie をエクスポートできるようです。
この種の経験を持つ人は、それがうまくいく可能性があるかどうかを言うことができますか?