単一フェーズ コミットおよび昇格可能単一フェーズ通知を使用した最適化

ここでは、パフォーマンスを最適化するために System.Transactions インフラストラクチャに用意されているメカニズムについて説明します。

PSPE (Promotable Single Phase Enlistment)

System.Transactions インフラストラクチャは、単一の永続性リソースまたは複数の揮発性リソースを含む単一のアプリケーション ドメイン内のトランザクションを管理します。System.Transactions インフラストラクチャは、アプリケーション内ドメインの呼び出しのみを使用するため、最良のスループットおよびパフォーマンスを得られます。

ただし、トランザクションが同じコンピュータ上の別のアプリケーション ドメインにある別のオブジェクト (プロセスやコンピュータの境界にまたがるものを含む) に供給される場合や、別の永続的リソース マネージャを参加させる場合、System.Transactions インフラストラクチャは、MSDTC によって管理されるトランザクションを自動的にエスカレートします。MSDTC によって管理されるトランザクションは、System.Transactions インフラストラクチャによって管理されるトランザクションに比べて、パフォーマンスが落ちます。

パフォーマンスを最適化するため、System.Transactions インフラストラクチャには PSPE (Promotable Single Phase Enlistment) が用意されており、異なるアプリケーション ドメイン、プロセス、またはコンピュータにある単一のリモート永続性リソースが、MSDTC トランザクションにエスカレートされることなく System.Transactions トランザクションに参加できるようになります。このリソース マネージャ (RM) は、必要に応じて後で分散トランザクション (または MSDTC トランザクション) にエスカレートできるトランザクションをホストおよび "所有" できます。これにより、MSDTC の使用頻度が少なくなります。

この特別なリソース マネージャは通常、内部に独自の非分散トランザクションを所有しており、実行時にこれらのトランザクションを分散トランザクションに変換する必要があります。たとえば、SQL Server 2005 はこのようなリソース マネージャです。この場合、System.Transactions インフラストラクチャは、トランザクションのエスカレーションが必要かどうかを監視するだけという受動的な管理役割を担います。System.Transactions インフラストラクチャとリソース マネージャ間の相互動作をサポートするため、リソース マネージャは、IPromotableSinglePhaseNotification インターフェイスを実装する必要があります。

EnlistPromotableSinglePhase メソッドは、後でエスカレートできる単一の永続性リソースを参加させるのに使用されます。このメソッドにより、必要に応じて参加リストをエスカレートできます。参加が成功すると、RM は内部トランザクションを作成し、System.Transactions トランザクションに関連付けます。PSPE の参加が失敗すると、RM は代わりに EnlistDurable メソッドを使用して参加を行います。トランザクションが既に分散トランザクションである場合や、別の RM が既に PSPE の参加を実行している場合、PSPE の参加は失敗します。

参加すると、System.Transactions トランザクションをコミットまたは中止するクライアントからの呼び出しがリソース マネージャでの呼び出しに変換されます。これは、それぞれ SinglePhaseCommit メソッドまたは Rollback を呼び出すことで行われます。

System.Transactions トランザクションのエスカレーションが必要ない場合、トランザクションがコミットされると、RM が SinglePhaseCommit 通知を受信します。次に、最初に作成された内部トランザクションがコミットされます。

System.Transactions トランザクションのエスカレートが必要な場合 (複数の RM をサポートする場合など) は、System.Transactions がリソース マネージャに通知します。この通知は、IPromotableSinglePhaseNotification インターフェイスの派生元である ITransactionPromoter インターフェイス上の Promote メソッドを呼び出すことで行われます。次に、リソース マネージャは、ローカル トランザクション (ログが不要) から DTC トランザクションに参加できるトランザクション オブジェクトへ、トランザクションを内部的に変換し、既に実行済みの作業に関連付けます。トランザクションのコミットが要求されると、トランザクション マネージャが SinglePhaseCommit 通知をリソース マネージャに送信し、リソース マネージャがエスカレーション中に作成される分散トランザクションをコミットします。

Noteメモ :

エスカレートされたトランザクションでコミットが呼び出されたときに生成される TransactionCommitted トレースは、DTC トランザクションのアクティビティ ID を含んでいます。

管理エスカレーションの詳細については、「トランザクション管理のエスカレーション」を参照してください。

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

次のシナリオは、System.Data 名前空間をリソース マネージャの "プロキシ" として使用して、分散トランザクションにエスカレートする操作を示しています。このシナリオでは、トランザクションで呼び出されたデータベースへの System.Data 接続 (CN1) が既に存在し、アプリケーションが別の System.Data 接続 (CN2) を呼び出そうとしている場合を想定しています。トランザクションは、完全な分散 2 フェーズ コミット トランザクションとして、DTC にエスカレートする必要があります。

このシナリオの内容

  1. CN1 は、トランザクションに参加するため、EnlistPromotableSinglePhase メソッドを呼び出します。ここで、トランザクションはまだローカルであり、トランザクションには他に昇格可能参加リストがないため、EnlistPromotableSinglePhase 呼び出しは成功します。

  2. 2 番目の接続 (CN2) が EnlistPromotableSinglePhase を呼び出すと、関連する別の昇格可能参加リストがあるため、呼び出しが失敗します。このため、CN2 は、DTC トランザクションを取得して、SQL に渡す必要があります。これには、TransactionInterop クラスで提供されるメソッドの 1 つを使用して、SQL に渡すことができるトランザクションの形式を生成します。

  3. System.Transactions は、CN1 によって実装された ITransactionPromoter インターフェイス上で、Promote メソッドを呼び出します。

  4. この時点で CN1 は、SQL 2005 固有のメカニズムと System.Data を使用して、トランザクションをエスカレートします。

  5. Promote メソッドからの戻り値は、トランザクションの反映トークンを含むバイト配列です。System.Transactions は、この反映トークンを使用して、ローカル トランザクションに統合できる DTC トランザクションを作成します。

  6. この時点で CN2 は、TransactionInterop によるメソッドの 1 つを呼び出すことで受信したデータを使用して、SQL にトランザクションを渡すことができます。

  7. ここで、両方が DTC 分散トランザクションに参加します。

単一フェーズ コミットの最適化

単一フェーズ コミット プロトコルは、すべての更新が明示的な調整なしに行われるため、実行時に、より効率的です。この最適化を活用するには、リソースの ISinglePhaseNotification インターフェイスを使用してリソース マネージャを実装し、EnlistDurable メソッドまたは EnlistVolatile メソッドを使用してトランザクションに参加する必要があります。特に、単一フェーズ コミットを確実に実行するには、EnlistmentOptions パラメータを None と同じにする必要があります。

ISinglePhaseNotification インターフェイスは IEnlistmentNotification インターフェイスから派生するため、RM が単一フェーズ コミットを実行できない場合でも、2 フェーズ コミット通知を受信できます。RM が TM から SinglePhaseCommit 通知を受信した場合は、コミットするために必要な作業を実行する必要があります。そして、それに応じて SinglePhaseEnlistment パラメータ上の Committed, Aborted または InDoubt メソッドを呼び出すことにより、トランザクションのコミットまたはロールバックのどちらが実行されるかを、トランザクション マネージャに通知する必要があります。この段階で、参加リストの Done の応答は、ReadOnly セマンティクスを意味します。したがって、他のメソッドに加えて、Done を応答しないでください。

揮発性参加リストが 1 つだけ存在し、永続参加リストが存在しない場合は、揮発性参加リストが SPC 通知を受信します。揮発性リストが複数、永続参加リストが 1 つだけ存在する場合は、揮発性参加リストは 2PC を受信します。完了すると、永続参加リストが SPC を受信します。

関連項目

概念

トランザクションの参加要素としてのリソースの参加
単一フェースおよび複数フェーズでのトランザクションのコミット

Footer image

Copyright © 2007 by Microsoft Corporation.All rights reserved.