SQL Serverと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
私は問題なく同じ環境の別のアプリケーションでこの方法で作業しましたが、ここではこの問題があります。問題を解決するにはどうすればよいですか?
「分散トランザクションコーディネーター」サービスがデータベースとクライアントの両方で実行されていることを確認してください。また、「ネットワークDTCアクセス」、「リモートクライアントを許可する」、「インバウンド/アウトバウンドを許可する」、「TIPを有効にする」を必ず確認してください。
MS DTCトランザクションのネットワークDTCアクセスを有効にするには
コンポーネントサービススナップインを開きます。
コンポーネントサービスを開くには、[開始]をクリックします。検索ボックスに「dcomcnfg」と入力し、Enterキーを押します。
コンソールツリーを展開して、ネットワークMS DTCアクセスを有効にするDTC(たとえば、ローカルDTC)を見つけます。
[操作]メニューの[プロパティ]をクリックします。
[セキュリティ]タブをクリックし、次の変更を行います。[セキュリティの設定]で、[ネットワークDTCアクセス]チェックボックスをオンにします。
トランザクションマネージャーの通信で、[受信を許可する]および[送信を許可する]チェックボックスをオンにします。
この問題は断続的に発生していました。ここの指示と他の非常に似た指示に従いました。すべてが正しく構成されました。
このページ: http://sysadminwebsite.wordpress.com/2012/05/29/9/ は、問題の発見に役立ちました。
基本的に、両方のサーバーでMSDTCのCIDが重複していました。 HKEY_CLASSES_ROOT\CID
参照: http://msdn.Microsoft.com/en-us/library/aa561924.aspx sectionMSDTCに一意のCID値が割り当てられていることを確認する
私は仮想サーバーを使用しており、サーバーチームはすべてのサーバーに同じイメージを使用することを好みます。これは簡単な修正であり、再起動は必要ありませんでした。ただし、DTCサービスは自動起動に設定する必要があり、再インストール後に起動する必要がありました。
「リンクサーバー」で別のストアプロシージャを呼び出すストアプロシージャがありました。ssmsで実行すると問題ありませんでしたが、application(By Entity Framework)で呼び出すと、このエラーが発生しました。この記事は私を助け、私はこのスクリプトを使用しました:
EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;
詳細については、これを見てください: リンクサーバー:パートナートランザクションマネージャーは、リモート/ネットワークトランザクションのサポートを無効にしました
私のシナリオでは、既存の接続で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.
}
}
answer からのコメント:「トランザクション内のすべてのデータベース呼び出しに同じオープン接続を使用していることを確認してください。– Magnus」
ユーザーは、トランザクションで作業していたデータとは別のデータベースに保存されます。ユーザーを取得するためにdb接続を開くと、このエラーが発生しました。他のdb接続とユーザールックアップをトランザクションスコープ外に移動すると、エラーが修正されました。
以下の解決策をここに投稿します。これは、いくつかの検索の後、これが私が着陸した場所であるため、他の可能性もあります。 EF 6を使用してストアドプロシージャを呼び出そうとしましたが、ストアドプロシージャにリンクサーバーが使用されていたため、同様のエラーが発生しました。
リンクサーバーのOLE DBプロバイダー_が分散トランザクションを開始できなかったため、操作を実行できませんでした
パートナートランザクションマネージャーは、リモート/ネットワークトランザクションのサポートを無効にしました*
SQL Clientにジャンプすると問題が修正され、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 Clientが必ずしも好ましい選択だとは思いませんが、似たような問題を抱えている他の誰かがgoogleでここに着いたら、少なくとも共有する価値があると感じました。
上記のコードはC#ですが、Sql Clientに切り替えようとするという概念は引き続き適用されます。少なくとも、そうしようとすることは診断になります。
同じエラーメッセージが表示されました。接続文字列でpooling=False
を;pooling=true;Max Pool Size=200
に変更すると、問題が修正されました。
他の人が同じ問題を抱えている場合:
同様のエラーが発生しました。トランザクションで複数のSQLステートメントをラップし、そのうちの1つがリンクサーバーで実行されていました(EXEC(...)AT Serverステートメントのマージステートメント)。リンクサーバーへの別の接続を開き、そのステートメントをtry ... catchにカプセル化し、キャッチがトリップした場合に元の接続でトランザクションを中止することで問題を解決しました。