97

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

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

4

10 に答える 10

155

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

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

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

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

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

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

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

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

于 2012-04-12T20:31:49.177 に答える
13

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

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

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

于 2017-06-07T09:10:20.010 に答える
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サービスは自動起動に設定する必要があり、再インストール後に開始する必要がありました。

于 2014-02-24T11:24:16.400 に答える
11

私のシナリオでは、既存の接続の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.
    }
}
于 2017-03-09T09:36:34.950 に答える
3

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

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

于 2016-03-08T01:15:24.573 に答える
2

以下の解決策をここに投稿します。いくつか検索した後、これが私が着陸した場所であり、他の解決策もそうかもしれないからです。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クライアントに切り替えようとする概念は引き続き適用されます。少なくとも、そうしようと試みることは診断になります。

于 2018-05-10T16:59:02.057 に答える
2

コンポーネントサービスでローカル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

そして登場!

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

于 2020-06-19T13:59:33.127 に答える
1

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

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

于 2015-11-17T00:06:13.290 に答える
1

ストアドプロシージャを作成しようとしたときに、SSMSのリンクサーバーでこの問題が発生していました。

リンクサーバーで、サーバーオプション「分散トランザクションでプロモーションを有効にする」をFalseに変更しました。

サーバーオプションのスクリーンショット

于 2019-09-17T17:09:42.007 に答える
0

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

于 2019-07-25T09:52:19.903 に答える