リソース マネージャーの実装Implementing a Resource Manager

トランザクションで使用される各リソースはリソース マネージャーによって管理され、その動作はトランザクション マネージャーによって調整されます。Each resource used in a transaction is managed by a resource manager, whose actions are coordinated by a transaction manager. リソース マネージャーは、トランザクション マネージャーと連携してアプリケーションに原子性と分離を保証します。Resource managers work in cooperation with the transaction manager to provide the application with a guarantee of atomicity and isolation. Microsoft SQL Server、永続的なメッセージ キュー、メモリ内ハッシュ テーブルはすべて、リソース マネージャーの例です。Microsoft SQL Server, durable message queues, in-memory hash tables are all examples of resource managers.

リソース マネージャーは、永続性データまたは揮発性データを管理します。A resource manager manages either durable or volatile data. リソース マネージャーの永続性または揮発性とは、リソース マネージャーがエラーの回復をサポートするかどうかを意味します。The durability (or conversely the volatility) of a resource manager refers to whether the resource manager supports failure recovery. リソース マネージャーがエラーの回復をサポートする場合、フェーズ 1 (準備) 中にデータが永続ストレージに保存されます。したがって、リソース マネージャーがダウンした場合でも、回復時にトランザクションへの再参加を行い、トランザクション マネージャーから受信した通知に基づいて適切な動作を実行できます。If a resource manager supports failure recovery, it persists data to durable storage during Phase1 (prepare) such that if the resource manager goes down, it can re-enlist in the transaction upon recovery and perform the proper actions based on the notifications received from the transaction manager. 一般に、揮発性リソース マネージャーは、メモリ内のデータ構造 (たとえば、メモリ内のトランザクション ハッシュ テーブル) などの揮発性リソースを管理し、永続的リソース マネージャーは、より永続的なバッキング ストアを持つリソース (たとえば、バッキング ストアがディスクであるデータベース) を管理します。In general, volatile resource managers manage volatile resources such as an in-memory data structure (for example, an in-memory transacted-hashtable), and durable resource managers manage resources that have a more persistent backing store (for example, a database whose backing store is disk).

リソースをトランザクションに参加させるには、リソースをトランザクションに登録する必要があります。In order for a resource to participate in a transaction, it must enlist in the transaction. クラスTransactionは、この機能を提供する、登録で始まる名前を持つ一連のメソッドを定義します。The Transaction class defines a set of methods whose names begin with Enlist that provide this functionality. さまざまな参加メソッドは、リソースマネージャーが持つことのできるさまざまな種類の参加リストに対応します。The different Enlist methods correspond to the different types of enlistment that a resource manager may have. 具体的には、揮発性リソースには EnlistVolatile メソッド、永続性リソースには EnlistDurable メソッドを使用します。Specifically, you use the EnlistVolatile methods for volatile resources, and the EnlistDurable method for durable resources. 簡単に説明すると、リソースが永続性をサポートするかどうかに応じて、EnlistDurable メソッドまたは EnlistVolatile メソッドのどちらを使用するかを決定した後、リソース マネージャーに IEnlistmentNotification インターフェイスを実装して、2 フェーズ コミット (2PC) に参加するようにリソースを登録する必要があります。For simplicity, after deciding whether to use the EnlistDurable or EnlistVolatile method based on your resource's durability support, you should enlist your resource to participate in Two Phase Commit (2PC) by implementing the IEnlistmentNotification interface for your resource manager. 2PC の詳細については、「単一フェーズおよび複数フェーズでのトランザクションのコミット」を参照してください。For more information on 2PC, see Committing a Transaction in Single-Phase and Multi-Phase.

参加により、リソース マネージャーは、トランザクションがコミットまたは中止したときに、トランザクション マネージャーからのコールバックを取得することを保証します。By enlisting, the resource manager ensures that it gets callbacks from the transaction manager when the transaction commits or aborts. 各参加リストについて、IEnlistmentNotification のインスタンスが 1 つ存在します。There is one instance of IEnlistmentNotification per enlistment. 通常、トランザクションごとに 1 つの参加リストが存在しますが、リソース マネージャーは、同じトランザクションへの複数回の参加を選択できます。Typically, there is one enlistment per transaction, but a resource manager can choose to enlist multiple times in the same transaction.

参加後、リソース マネージャーはトランザクションの要求に応答します。After enlistment, the resource manager responds to the transaction's requests. 永続的リソース マネージャーは、管理するリソースに対するトランザクションの処理を元に戻したり、やり直したりするための十分な情報を格納しています。A durable resource manager stores enough information to allow it to either undo or redo the transaction's work on resources it manages. このためには、さまざまな方法があります。データのバージョン保持と変更ログの保持という 2 つの手法が一般的に使用されます。There are many ways to do this; keeping versions of data or keeping a log of the changes are two common techniques.

アプリケーションがトランザクションをコミットすると、トランザクション マネージャーが 2 フェーズ コミット プロトコルを開始します。When the application commits the transaction, the transaction manager initiates the two-phase commit protocol. トランザクション マネージャーはまず、参加している各リソース マネージャーに、トランザクションをコミットする準備が整っているかどうかを確認します。The transaction manager first asks each enlisted resource manager if it is prepared to commit the transaction. リソース マネージャーは、コミットの準備、つまりトランザクションをコミットまたは中止できる状態を整える必要があります。The resource manager must prepare to commit—it readies itself to either commit or abort the transaction.

準備フェーズ中に、永続的リソース マネージャーは安定したストレージに新旧のデータを記録します。したがって、システム障害が発生してもリソース マネージャーはデータを回復できます。During the prepare phase, the durable resource manager records the old and new data in stable storage so that the resource manager can recover it even if the system fails. リソース マネージャーは準備が整うと、トランザクションをコミットまたは中止するかどうかの決定をトランザクション マネージャーに通知します。If the resource manager can prepare, it informs the transaction manager its vote on whether to commit or abort the transaction. いずれかのリソース マネージャーが準備の失敗を報告すると、トランザクション マネージャーは各リソース マネージャーにロールバック コマンドを送信し、アプリケーションにコミットの失敗を通知します。If any resource manager reports a failure to prepare, the transaction manager sends a rollback command to each resource manager and indicates the failure of the commit to the application.

準備が整うと、リソース マネージャーは、フェーズ 2 でトランザクション マネージャーからコミットまたは中止のコールバックを取得するまで待機する必要があります。Once prepared, a resource manager must wait until it gets a commit or abort callback from the transaction manager in phase 2. 通常、準備とコミット プロトコルの全体は瞬時に完了します。Typically, the entire prepare and commit protocol completes in a fraction of a second. システムまたは通信に障害が発生した場合、コミットまたは中止の通知が数分または数時間経っても到着しないことがあります。If there are system or communication failures, the commit or abort notification may not arrive for minutes or hours. この間、リソース マネージャーはトランザクションの結果について判断できず、During this period, the resource manager is in doubt about the outcome of the transaction. トランザクションがコミットまたは中止されたかどうかを認識できません。It does not know whether the transaction committed or aborted. トランザクションについて判断できない間、リソース マネージャーはトランザクションをロックし続けてデータの変更を維持し、これらの変更部分を他のトランザクションから分離した状態にします。While the resource manager is in doubt about a transaction, it keeps the data modified by keeping the transaction locked, thereby isolating these changes from any other transactions.

リソース マネージャーが失敗すると、そのすべての参加トランザクションは、失敗前に準備またはコミットされたものを除いて中止されます。When a resource manager fails, all of its enlisted transactions are aborted except for those that are prepared or committed prior to the failure. 永続的リソース マネージャーは再起動時に、準備フェーズで書き込まれた準備情報を取得することにより、管理するリソースのコミット状態を再構築し、それに応じてトランザクションをコミットまたは中止します。When a durable resource manager restarts, it reconstructs the committed state of the resources it manages by retrieving the prepare information written in the prepare phase, and commits or aborts these transactions accordingly.

要約すると、2 フェーズ コミット プロトコルとリソース マネージャーの組み合わせにより、トランザクションの原子性と永続性が実現されます。In summary, the two-phase commit protocol and the resource managers combine to make transactions atomic and durable.

Transaction クラスは、PSPE (Promotable Single Phase Enlistment) を参加させるための EnlistPromotableSinglePhase メソッドも提供しています。The Transaction class also provides the EnlistPromotableSinglePhase method to enlist a Promotable Single Phase Enlistment (PSPE). これにより、永続的リソース マネージャー (RM) は、MSDTC による管理のために後で必要に応じてエスカレートできるトランザクションをホストおよび "所有" できます。This allows a durable resource manager (RM) to host and "own" a transaction that can later be escalated to be managed by the MSDTC if necessary. 詳細については、「単一フェーズコミットと昇格可能単一フェーズ通知を使用した最適化」を参照してください。For more information on this, see Optimization using Single Phase Commit and Promotable Single Phase Notification.

このセクションの内容In This Section

リソース マネージャーが通常実行する手順の概要については、次のトピックを参照してください。The steps generally followed by a resource manager are outlined in the following topics.

トランザクションの参加要素としてのリソースの参加Enlisting Resources as Participants in a Transaction

永続性リソースまたは揮発性リソースがトランザクションに参加する方法について説明しています。Describes how a durable or volatile resource can enlist in a transaction.

単一フェースおよび複数フェーズでのトランザクションのコミットCommitting a Transaction in Single-Phase and Multi-Phase

リソース マネージャーがコミット通知に応答し、コミットの準備を行うしくみについて説明しています。Describes how a resource manager responds to commit notification and prepare the commit.

回復の実行Performing Recovery

永続的リソース マネージャーが、どのようにエラーから回復するかについて説明しています。Describes how a durable resource manager recovers from failure.

リソースへのアクセス時のセキュリティ信頼レベルSecurity Trust Levels in Accessing Resources

System.Transactions の 3 つの信頼レベルで、System.Transactions が公開するリソースの種類に対するアクセスがどのように制限されるかについて説明しています。Describes how the three levels of trust for System.Transactions restrict access on the types of resources that System.Transactions exposes.

単一フェーズ コミットおよび昇格可能単一フェーズ通知を使用した最適化Optimization using Single Phase Commit and Promotable Single Phase Notification

リソース マネージャーの実装に使用できる最適化の技法について説明します。Describes optimization practices available to implementations of resource managers.