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


86

SQLServerとASP.NETを使用しています。私は次の機能を持っています:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

ただし、例外 'トランザクションマネージャは、リモート/ネットワークトランザクションのサポートを無効にしました。'がスローされます。

JoinScopeの説明:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

私は同じ環境の別のアプリケーションで問題なくこのように作業しましたが、ここでこの問題が発生します。問題を解決するにはどうすればよいですか?


Magnusが最初に提案した手順を実行して、いわばすべてのベースがカバーされていることを確認した後、SQL Serverでclrを有効にするセットを示唆するエラーが発生し、それが機能しました。msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

回答:


141

「分散トランザクションコーディネーター」サービスがデータベースとクライアントの両方で実行されていることを確認してください。また、「ネットワークDTCアクセス」、「リモートクライアントを許可」、「インバウンド/アウトバウンドを許可」、「TIPを有効にする」も必ずチェックしてください。

MSDTCトランザクションのネットワークDTCアクセスを有効にするには

  1. コンポーネントサービススナップインを開きます。

    コンポーネントサービスを開くには、[開始]をクリックします。検索ボックスに「dcomcnfg」と入力し、Enterキーを押します。

  2. コンソールツリーを展開して、ネットワークMS DTCアクセスを有効にするDTC(たとえば、ローカルDTC)を見つけます。

  3. [アクション]メニューで、[プロパティ]をクリックします。

  4. [セキュリティ]タブをクリックして、次の変更を行います。[セキュリティの設定]で、[ネットワークDTCアクセス]チェックボックスをオンにします。

    Transaction Manager Communicationで、[インバウンドを許可する]チェックボックスと[アウトバウンドを許可する]チェックボックスをオンにします。


3
ありがとう、マグナス。このタイプのトランザクションは同じコンピューターで機能したため、これはアプリケーションの設定である必要があります。つまり、この問題はマシンに関連していません。
Lajos Arpad 2012

はい、しました。同じ例外をスローします。
Lajos Arpad 2012

TransactionScope内で実際に行っていることと関係があると思います。
マグナス

また、このトランザクションを単一の要求としてデータベースサーバーに送信するため、結合スコープが必要です。
Lajos Arpad 2012

13
トランザクション内のすべてのデータベース呼び出しに同じオープン接続を使用するようにしてください。
マグナス

11

私はこの問題を断続的に受けていました、私はここの指示と他の場所で非常に類似したものに従いました。すべてが正しく構成されました。

このページ:http//sysadminwebsite.wordpress.com/2012/05/29/9/は、問題を見つけるのに役立ちました。

基本的に、両方のサーバーでMSDTCのCIDが重複していました。 HKEY_CLASSES_ROOT \ CID

参照:http//msdn.microsoft.com/en-us/library/aa561924.aspxセクションMSDTCに一意のCID値が割り当てられていることを確認します

私は仮想サーバーを使用していますが、サーバーチームはすべてのサーバーに同じイメージを使用するのが好きです。これは簡単な修正であり、再起動する必要はありませんでした。ただし、DTCサービスは自動起動に設定する必要があり、再インストール後に開始する必要がありました。


9

「リンクサーバー」で別のストアプロシージャを呼び出すストアプロシージャがありました。ssmsで実行すると問題ありませんでしたが、アプリケーション(Entity Frameworkによる)で呼び出すと、このエラーが発生しました。この記事は私を助け、私はこのスクリプトを使用しました:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

詳細については、これを参照してください。 リンクサーバー:パートナートランザクションマネージャーがリモート/ネットワークトランザクションのサポートを無効にしました


1
ソリューションへのリンクは大歓迎ですが、それがなくても回答が役立つことを確認してください。リンクの周りにコンテキストを追加して、他のユーザーがそれが何であるか、なぜそこにあるのかを理解できるようにしてから、ページの最も関連性の高い部分を引用してください。ターゲットページが利用できない場合に再リンクします。リンクに過ぎない回答は削除される場合があります。
ペッターフリバーグ2017年

1
これで私の問題は解決したので、これを提供していただきありがとうございます。それが私の特定の問題を修正するのに役立ったので、なぜそれが-1票を得たのか分かりません。
ボイドP

6

私のシナリオでは、既存の接続のTransactionScope内に新しい接続インスタンスを作成しようとしたため、例外がスローされていました。

例:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}

3

回答からのコメント:「トランザクション内のすべてのデータベース呼び出しに同じオープン接続を使用するようにしてください。– Magnus」

ユーザーは、トランザクションで使用していたデータとは別のデータベースに保存されます。データベース接続を開いてユーザーを取得すると、このエラーが発生していました。他のデータベース接続とユーザールックアップをトランザクションスコープ外に移動すると、エラーが修正されました。


1

以下の解決策をここに投稿します。いくつか検索した後、これが私が着陸した場所であるため、他の解決策もそうかもしれません。EF 6を使用してストアドプロシージャを呼び出そうとしましたが、ストアドプロシージャにリンクサーバーが使用されていたため、同様のエラーが発生しました。

リンクサーバーのOLEDBプロバイダー_が分散トランザクションを開始できなかったため、操作を実行できませんでした

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

SQLクライアントにジャンプすると、問題が修正されました。これにより、EFの問題であることが確認されました。

EFモデルで生成されたメソッドベースの試行:

db.SomeStoredProcedure();

ExecuteSqlCommandベースの試行:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

と:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

そのコードは短くすることができますが、バージョンはデバッグとステップスルーに少し便利だと思います。

SQLクライアントが必ずしも好ましい選択であるとは思いませんが、同様の問題を抱えている他の誰かがグーグルによってここに上陸した場合、これは少なくとも共有する価値があると感じました。

上記のコードはC#ですが、SQLクライアントに切り替えようとする概念は引き続き適用されます。少なくとも、そうしようとすると診断になります。


面白い。質問のタグと一致するように、VBコード(利用可能なコードトランスレーターがあります)を使用してソリューションを編集することをお勧めします。しかし、それでも私はそれを支持しました。
Lajos Arpad 2018年

1

コンポーネントサービスでローカルDTCが見つからなかった場合は、最初に次のPowerShellスクリプトを実行してみてください。

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

そして登場!

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


0

他の人が同じ問題を抱えている場合:

同様のエラーが発生しました。トランザクションでいくつかのSQLステートメントをラップしていて、そのうちの1つがリンクサーバーで実行されていたことが判明しました(EXEC(...)ATサーバーステートメントのMergeステートメント)。リンクサーバーへの別の接続を開き、そのステートメントをtry ... catchにカプセル化して、キャッチがトリップした場合に備えて元の接続でトランザクションを中止することで、問題を解決しました。


0

同じエラーメッセージが表示されました。私にとって、接続文字列pooling=False;pooling=true;Max Pool Size=200に変更すると、問題が修正されました。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.