このアプリケーションでは、TransactionScopeを使用しています。 MSDTCサービスは、軽量トランザクションよりもはるかに遅いため、使用しないことを目指しています。
using (var transactionScope = new TransactionScope())
{
...
transactionScope.Complete();
}
テストデータベースに接続している間は、MSDTCは必要ありませんが、同じマシンで実行されるまったく同じコードは、運用データベースまたは開発データベースに接続されているときにMSDTCを使用するようにエスカレートします。
開発データベースはクラスター化されておらず、名前付きインスタンスではありません。
すべてSQL Server 2008(10.50.2500)であり、接続文字列はホスト名を除いてまったく同じです。
データベースの設定に多少の違いがあるようです。それが何であるかについてのアイデアはありますか?
[〜#〜]編集[〜#〜]
トランザクションは、2つの異なるテーブルの挿入を保護するためにありました。そこに2つの選択をもたらす2つの呼び出しもあることに気づきました。これらをトランザクションに含める必要はなかったので、トランザクションの外に移動しました。その後、MSDTCの必要性は3つのデータベースすべてでなくなりました。 問題は解決しましたが、何が原因であるのか本当にわかりませんでした。
これを機能させるには、次のような方法があります。
Enlist=false
を比較しますMultipleActiveResultSets=true
を比較しますTransactionScope
で複数の接続を使用することもできますが、同時に複数の接続を使用することはできません。ただし、ThreadStatic
接続を維持してそれを渡すことができます(または、以前のように、dbラッパークラスでThreadLocal<>
を使用します)。これにより、ASP.NETでの同時実行性の問題が解決されました。不必要なエスカレーションConnectionString
プロパティを使用して新しい接続を作成しないでください。元の接続とは異なる場合があり、エスカレーションが発生します。私が便利だと思ったもの:
ConnectionScope
クラスは私にいくつかのアイデアを与えました: http://blogs.msdn.com/b/dataaccess/archive/2006/02/14/532026.aspxTransactionScope
があります! http://blogs.msdn.com/b/dbrowne/archive/2010/06/03/using-new-transactionscope-considered-harmful.aspxこの場合、同じ接続文字列を使用する複数の接続があります
無関係です。 2番目の接続= MSDTCへの伝播。できることは、複数の接続を開くことだけではありません。 ne接続に固執すると、MSDTCに伝播しません。 2番目の文字列を開きます-最初の文字列が閉じている場合でも同じ文字列-そして、新しい文字列に接続を再割り当てできない、または再割り当てしないので、それを伝播する必要があります。これにより、定義ごとに2つの機能が分散トランザクションになります。