6

TransactionScopeを使用して作業を始めたばかりですが、デバッグに永遠にかかる予期しないことが常に発生していることがわかりました。

これらのリストを統合することは、これらの「奇妙なエラー」の状況に加えて、プラットフォームの奇妙さに関する知識を広げるのに最適だと思います。

トランザクションスコープをどのように使用するかについてのコンテキスト:

  • ウェブアプリケーション
  • 複数のWebサーバー、アプリケーションサーバー、SQLサーバー
  • トランザクションは主にデータベーストランザクションになりますが、MSMQに書き込むために昇格されるものもあります。
4

3 に答える 3

3

私の頭のてっぺんから2つのこと:

  • 接続に同じ接続文字列がある場合でも、同じスコープで複数の接続オブジェクトを使用すると、トランザクションが昇格されます(これはSQL 2008で修正されています)。このスレッドで詳細を読むと、dbconnectionscopeはSQL2005でその問題を解決します
  • msdtcインスタンスは相互に認識できる必要があり、セキュリティを正しく設定する必要があります http://support.microsoft.com/kb/899191(インバウンドとアウトバウンドを許可し、相互認証を必要としないのが通常最も安全な方法です)。ここで説明されているように、DTCPingを使用してdtcインスタンス間の接続の問題をトラブルシューティングします:http ://support.microsoft.com/kb/306843

トランザクションを可能な限り軽量にする必要がある場合、dtcは多くのオーバーヘッドをもたらします。また、トランザクションをできるだけ短くしたいので、アプリケーションサーバーにのみ導入し、Webサーバーには導入しないでください。アプリケーションサーバーとデータベースの間のネットワークをできるだけ小さく、できるだけ速くホップし、アプリサーバーとデータベースの間とは異なる接続を介してウェブサーバーとアプリサーバーの間でネットワークトラフィックを送信し、最後のサーバーを高速にします、途方もなく短い接続。

複数のアプリケーションサーバーがある場合は、msdtcの単一のインスタンスをサーバー(データベースやアプリサーバーの1つなど)で実行し、それぞれが独自に実行するのではなく、すべてのアプリケーションサーバーからリモートで使用することを検討できます。これがどのような追加のメリットがあるのか​​わかりません。

于 2009-12-16T14:33:56.823 に答える
1

うまくいけば、これはいつか誰かを助けるでしょう:

内部に複数の SQL 操作を含む TransactionScope がある場合、DTC は関与しません。

  1. 各接続に同一の接続文字列を使用します
  2. 接続はネストされていません。

つまり、開く、何かをする、閉じる。開く、何かをする、閉じる。

落とし穴:プロセスで(別のスレッドで)これを行う場合

SqlConnection.ClearAllPools()

そして、それはたまたま 2 つの操作の間に発生します。DTC はすぐに関与します。DTC を実行していない場合は、例外がスローされます。

于 2013-02-12T04:18:09.167 に答える
-2

SQL Server を使用し、@@trancount にチェックを入れると、アクティブな TransactionScope があっても 0 になります。

于 2009-12-16T15:18:33.313 に答える