トランザクション管理のエスカレーション
Windows は、トランザクション マネージャーを構成する一連のサービスとモジュールをホストします。 トランザクション管理のエスカレーションとは、トランザクション マネージャーのいずれかのコンポーネントから別のコンポーネントにトランザクションを移行するプロセスを表します。
System.Transactions には、最大で 1 つの永続的なリソースまたは複数の揮発性リソースに関連するトランザクションを調整するトランザクション マネージャー コンポーネントが含まれています。 トランザクション マネージャーは、アプリケーション内ドメインの呼び出しのみを使用するため、最良のパフォーマンスを得られます。 開発者は、トランザクション マネージャーを直接操作する必要はありません。 その代わり、インターフェイス、共通する動作、およびヘルパー クラスを定義する共通インフラストラクチャが、System.Transactions 名前空間によって用意されています。
同じコンピューターにある別のアプリケーション ドメイン (プロセスやマシンの境界をまたぐドメインを含む) 内のオブジェクトにトランザクションを提供する場合は、System.Transactions インフラストラクチャは、トランザクションを自動的にエスカレートして、Microsoft 分散トランザクション コーディネーター (MSDTC) によって管理されるようにします。 エスカレーションは、別の永続的なリソース マネージャーに参加する際にも発生します。 エスカレートされると、トランザクションは完了するまで昇格した状態で管理され続けます。
System.Transactions トランザクションと MSDTC トランザクションの間には、PSPE (Promotable Single Phase Enlistment) を介して利用できる中間タイプのトランザクションがあります。 PSPE は、System.Transactions でパフォーマンスを最適化するための重要なメカニズムです。 PSPE を使用すると、異なるアプリケーション ドメイン、プロセス、コンピューターにあるリモート永続リソースが、MSDTC トランザクションにエスカレートされることなく、System.Transactions トランザクションに参加できるようになります。 PSPE の詳細については、「トランザクションの参加要素としてのリソースの参加」を参照してください。
エスカレーションの開始方法
トランザクションのエスカレーションが行われると、パフォーマンスが低下します。MSDTC は別のプロセスにあるため、トランザクションを MSDTC にエスカレートすると、プロセス間でメッセージが送信されることになるからです。 パフォーマンスを向上させるには、MSDTC へのエスカレーションを遅延または回避します。このため、エスカレーションが開始される方法とその条件を知る必要があります。
System.Transactions インフラストラクチャが揮発性リソースと、単一フェーズの通知をサポートする最大 1 つの永続リソースを処理している限り、トランザクションは、System.Transactions インフラストラクチャが所有し続けます。 トランザクション マネージャーが有効であるのは、同じアプリケーション ドメインに存在し、ログ (トランザクション結果のディスクへの書き込み) が必要ないリソースに対してのみです。 次の場合には、System.Transactions インフラストラクチャにより、トランザクションの所有権が MSDTC に移されます。
単一フェーズ通知をサポートしない永続リソースが少なくとも 1 つトランザクションに参加している場合。
単一フェーズ通知をサポートする永続リソースが少なくとも 2 つトランザクションに参加している場合。 たとえば、SQL Server 2005 との単一の接続の参加では、トランザクションの昇格は発生しません。 一方、SQL Server 2005 データベースへの別の接続を開いてデータベースが参加したときには、System.Transactions インフラストラクチャは、このトランザクションの 2 つ目の永続リソースであることを検出し、MSDTC トランザクションにエスカレートします。
別のアプリケーション ドメインまたはプロセスにトランザクションを "マーシャリング" する要求が呼び出された場合。 たとえば、アプリケーション ドメイン境界をまたぐトランザクション オブジェクトのシリアル化などです。 トランザクション オブジェクトは、値によってマーシャリングされます。つまり、アプリケーション ドメイン境界を越えてトランザクション オブジェクトを渡そうとすると (同じプロセス内でも)、トランザクション オブジェクトのシリアル化が発生します。 Transaction をパラメーターとして受け取るリモート メソッドを呼び出すことで、トランザクション オブジェクトを渡すことができます。または、リモートのトランザクション サービス コンポーネントにアクセスすることもできます。 この場合、トランザクション オブジェクトがシリアル化され、エスカレーションが発生します。アプリケーション ドメインをまたいでトランザクションがシリアル化される場合と同様です。 トランザクションが分散されるので、ローカルのトランザクション マネージャーでは不十分になります。
エスカレーション中にスローされる可能性のある例外をすべて次の表に示します。
例外の種類 | 条件 |
---|---|
InvalidOperationException | 分離レベルが Snapshot のトランザクションをエスカレートしようとしました。 |
TransactionAbortedException | トランザクション マネージャーがダウンしています。 |
TransactionException | エスカレーションが失敗し、アプリケーションが中止されます。 |
.NET