次の方法で共有


トランザクション管理のエスカレーション

Windows は、トランザクション マネージャーを構成する一連のサービスとモジュールをホストします。 トランザクション管理エスカレーションでは、トランザクション マネージャーのいずれかのコンポーネントから別のコンポーネントにトランザクションを移行するプロセスについて説明します。

System.Transactions には、最大で 1 つの永続リソースまたは複数の揮発性リソースを含むトランザクションを調整するトランザクション マネージャー コンポーネントが含まれます。 トランザクション マネージャーはアプリケーション内ドメイン呼び出しのみを使用するため、最適なパフォーマンスが得られます。 開発者は、トランザクション マネージャーと直接やり取りする必要はありません。 代わりに、インターフェイス、一般的な動作、ヘルパー クラスを定義する共通インフラストラクチャは、 System.Transactions 名前空間によって提供されます。

同じコンピューター上の別のアプリケーション ドメイン (プロセスとマシンの境界を越えて含む) のオブジェクトにトランザクションを提供する場合、 System.Transactions インフラストラクチャは、Microsoft 分散トランザクション コーディネーター (MSDTC) によって管理されるトランザクションを自動的にエスカレートします。 エスカレーションは、別の永続リソース マネージャーを参加させる場合にも発生します。 エスカレートされたトランザクションは、完了するまで管理者特権の状態で管理されたままになります。

System.Transactions トランザクションと MSDTC トランザクションの間には、Promotable Single Phase Enlistment (PSPE) を介して提供される中間的なトランザクションの種類があります。 PSPE は、パフォーマンス最適化のための System.Transactions のもう 1 つの重要なメカニズムです。 これにより、別のアプリケーション ドメイン、プロセス、またはコンピューターにあるリモートの永続的リソースが、MSDTC トランザクションにエスカレートされることなく、 System.Transactions トランザクションに参加できるようになります。 PSPE の詳細については、「 トランザクションにリソースを参加させる」を参照してください。

エスカレーションの開始方法

MSDTC は別のプロセスに存在し、トランザクションを MSDTC にエスカレートするとプロセス間でメッセージが送信されるため、トランザクションのエスカレーションによってパフォーマンスが低下します。 パフォーマンスを向上させるには、MSDTC へのエスカレーションを遅らせるか回避する必要があります。したがって、エスカレーションが開始される方法とタイミングを知る必要があります。

System.Transactions インフラストラクチャが揮発性リソースと、単一フェーズ通知をサポートする最大 1 つの永続的なリソースを処理する限り、トランザクションはSystem.Transactions インフラストラクチャの所有権に残ります。 トランザクション マネージャーは、同じアプリケーション ドメインに存在し、ログ記録 (トランザクション結果をディスクに書き込む) が不要なリソースにのみ使用できます。 トランザクションの所有権を MSDTC に転送する System.Transactions インフラストラクチャのエスカレーションは、次の場合に発生します。

  • 単一フェーズの通知をサポートしていない非消耗品リソースが少なくとも 1 つトランザクションに参加します。

  • 単一フェーズ通知をサポートする少なくとも 2 つの永続的なリソースがトランザクションに参加します。 たとえば、SQL Server 2005 との単一の接続を使用すると、トランザクションは昇格されない。 ただし、SQL Server 2005 データベースへの 2 つ目の接続を開いてデータベースが参加する場合、 System.Transactions インフラストラクチャは、それがトランザクション内の 2 番目の永続的なリソースであることを検出し、MSDTC トランザクションにエスカレートします。

  • トランザクションを別のアプリケーション ドメインまたは別のプロセスに "マーシャリング" する要求が呼び出されます。 たとえば、アプリケーション ドメイン境界を越えたトランザクション オブジェクトのシリアル化です。 トランザクション オブジェクトは値によってマーシャリングされます。つまり、アプリケーション ドメインの境界を越えて渡そうとすると (同じプロセスであっても)、トランザクション オブジェクトがシリアル化されます。 トランザクション オブジェクトを渡すには、 Transaction をパラメーターとして受け取るリモート メソッドを呼び出すか、リモート トランザクションサービスコンポーネントにアクセスしてみてください。 これにより、トランザクション オブジェクトがシリアル化され、アプリケーション ドメイン間でトランザクションがシリアル化される場合と同様に、エスカレーションが発生します。 分散処理が行われているため、ローカルトランザクションマネージャーはもう十分ではありません。

エスカレーション中にスローされる可能性のある例外をすべて次の表に示します。

例外の種類 条件
InvalidOperationException 分離レベルが Snapshot と等しいトランザクションをエスカレートする試み。
TransactionAbortedException トランザクション マネージャーがダウンしています。
TransactionException エスカレーションが失敗し、アプリケーションが中止されます。