web-dev-qa-db-ja.com

TransactionScopeをMSDTCに昇格させるサーバープロパティは何ですか?

このアプリケーションでは、TransactionScopeを使用しています。 MSDTCサービスは、軽量トランザクションよりもはるかに遅いため、使用しないことを目指しています。

using (var transactionScope = new TransactionScope())
{
  ...
  transactionScope.Complete();
}

テストデータベースに接続している間は、MSDTCは必要ありませんが、同じマシンで実行されるまったく同じコードは、運用データベースまたは開発データベースに接続されているときにMSDTCを使用するようにエスカレートします。

開発データベースはクラスター化されておらず、名前付きインスタンスではありません。

すべてSQL Server 2008(10.50.2500)であり、接続文字列はホスト名を除いてまったく同じです。

データベースの設定に多少の違いがあるようです。それが何であるかについてのアイデアはありますか?

[〜#〜]編集[〜#〜]

トランザクションは、2つの異なるテーブルの挿入を保護するためにありました。そこに2つの選択をもたらす2つの呼び出しもあることに気づきました。これらをトランザクションに含める必要はなかったので、トランザクションの外に移動しました。その後、MSDTCの必要性は3つのデータベースすべてでなくなりました。 問題は解決しましたが、何が原因であるのか本当にわかりませんでした。

7
Jonas Elfström

これを機能させるには、次のような方法があります。

  • 接続文字列のEnlist=falseを比較します
  • 接続文字列のMultipleActiveResultSets=trueを比較します
  • ユーザーインスタンスデータベースは、何らかの理由で動作が異なるようです-一貫して動作させることができませんでした-常に完全なデータベースを使用してください
  • 同じ接続を再利用(閉じる/再開)することも、TransactionScopeで複数の接続を使用することもできますが、同時に複数の接続を使用することはできません。ただし、ThreadStatic接続を維持してそれを渡すことができます(または、以前のように、dbラッパークラスでThreadLocal<>を使用します)。これにより、ASP.NETでの同時実行性の問題が解決されました。不必要なエスカレーション
  • Db <2008または互換性レベル<100の場合は気にしないでください
  • 接続文字列を使用する場合は、別の接続のConnectionStringプロパティを使用して新しい接続を作成しないでください。元の接続とは異なる場合があり、エスカレーションが発生します。
  • 必要な間だけ接続を開いたままにし、できるだけ早い機会に閉じてください。

私が便利だと思ったもの:

5
enashnash

この場合、同じ接続文字列を使用する複数の接続があります

無関係です。 2番目の接続= MSDTCへの伝播。できることは、複数の接続を開くことだけではありません。 ne接続に固執すると、MSDTCに伝播しません。 2番目の文字列を開きます-最初の文字列が閉じている場合でも同じ文字列-そして、新しい文字列に接続を再割り当てできない、または再割り当てしないので、それを伝播する必要があります。これにより、定義ごとに2つの機能が分散トランザクションになります。

1
TomTom