IEnlistmentNotification IEnlistmentNotification IEnlistmentNotification IEnlistmentNotification Interface

定義

リソース マネージャーが参加の登録時にトランザクション マネージャーに対して 2 フェーズ コミット通知コールバックを提供するために実装する必要があるインターフェイスについて説明します。Describes an interface that a resource manager should implement to provide two phase commit notification callbacks for the transaction manager upon enlisting for participation.

public interface class IEnlistmentNotification
public interface IEnlistmentNotification
type IEnlistmentNotification = interface
Public Interface IEnlistmentNotification
派生

次の例は、このインターフェイスの実装と、 EnlistVolatileメソッドを使用して、オブジェクトをトランザクションの参加要素として参加させる方法を示しています。The following example shows an implementation of this interface, as well as enlisting the object as a participant in a transaction using the EnlistVolatile method.

static void Main(string[] args)
{
	try
	{
		using (TransactionScope scope = new TransactionScope())
		{
		
			//Create an enlistment object
			myEnlistmentClass myElistment = new myEnlistmentClass();

			//Enlist on the current transaction with the enlistment object
			Transaction.Current.EnlistVolatile(myElistment, EnlistmentOptions.None);

			//Perform transactional work here.

			//Call complete on the TransactionScope based on console input
                   			ConsoleKeyInfo c;
			while(true)
                   			{
				Console.Write("Complete the transaction scope? [Y|N] ");
				c = Console.ReadKey();
				Console.WriteLine();
		
                        			if ((c.KeyChar == 'Y') || (c.KeyChar == 'y'))
				{
					scope.Complete();
					break;
				}
				else if ((c.KeyChar == 'N') || (c.KeyChar == 'n'))
				{
					break;
				}
			}
		}
	}
	catch (System.Transactions.TransactionException ex)
	{
		Console.WriteLine(ex);
	}
	catch
	{
		Console.WriteLine("Cannot complete transaction");
		throw;
	}
}

class myEnlistmentClass : IEnlistmentNotification
{
	public void Prepare(PreparingEnlistment preparingEnlistment)
	{
		Console.WriteLine("Prepare notification received");

		//Perform transactional work

		//If work finished correctly, reply prepared
		preparingEnlistment.Prepared();

		// otherwise, do a ForceRollback
		preparingEnlistment.ForceRollback();
	}

	public void Commit(Enlistment enlistment)
	{
		Console.WriteLine("Commit notification received");

		//Do any work necessary when commit notification is received

		//Declare done on the enlistment
		enlistment.Done();
	}

	public void Rollback(Enlistment enlistment)
	{
		Console.WriteLine("Rollback notification received");

		//Do any work necessary when rollback notification is received

		//Declare done on the enlistment
		enlistment.Done();
	}

	public void InDoubt(Enlistment enlistment)
	{
		Console.WriteLine("In doubt notification received");

		//Do any work necessary when indout notification is received
		
		//Declare done on the enlistment
		enlistment.Done();
	}
}
	Public Shared Sub Main()
		Try
			Using scope As TransactionScope = New TransactionScope()

				'Create an enlistment object
				Dim myEnlistmentClass As New EnlistmentClass

				'Enlist on the current transaction with the enlistment object
				Transaction.Current.EnlistVolatile(myEnlistmentClass, EnlistmentOptions.None)

				'Perform transactional work here.

				'Call complete on the TransactionScope based on console input
				Dim c As ConsoleKeyInfo
				While (True)
					Console.Write("Complete the transaction scope? [Y|N] ")
					c = Console.ReadKey()
					Console.WriteLine()
					If (c.KeyChar = "Y") Or (c.KeyChar = "y") Then
						scope.Complete()
						Exit While
					ElseIf ((c.KeyChar = "N") Or (c.KeyChar = "n")) Then
						Exit While
					End If
				End While
			End Using
		Catch ex As TransactionException
			Console.WriteLine(ex)
		Catch
			Console.WriteLine("Cannot complete transaction")
			Throw
		End Try
	End Sub
End Class

Public Class EnlistmentClass
	Implements IEnlistmentNotification

	Public Sub Prepare(ByVal myPreparingEnlistment As PreparingEnlistment) Implements System.Transactions.IEnlistmentNotification.Prepare
		Console.WriteLine("Prepare notification received")

		'Perform transactional work

		'If work finished correctly, reply with prepared
		myPreparingEnlistment.Prepared()
	End Sub

	Public Sub Commit(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.Commit
		Console.WriteLine("Commit notification received")

		'Do any work necessary when commit notification is received

		'Declare done on the enlistment
		myEnlistment.Done()
	End Sub

	Public Sub Rollback(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.Rollback
		Console.WriteLine("Rollback notification received")

		'Do any work necessary when rollback notification is received

		'Declare done on the enlistment
		myEnlistment.Done()
	End Sub

	Public Sub InDoubt(ByVal myEnlistment As Enlistment) Implements System.Transactions.IEnlistmentNotification.InDoubt
		Console.WriteLine("In doubt notification received")

		'Do any work necessary when indout notification is received

		'Declare done on the enlistment
		myEnlistment.Done()
	End Sub
End Class

注釈

リソースマネージャーをトランザクションに参加させるには、トランザクションマネージャーを使用してトランザクションに参加する必要があります。In order for a resource manager to participate in a transaction, it must enlist in the transaction through the transaction manager. Transaction クラスは、この機能を提供する一連のメソッドを定義しています。これらのメソッドの名前は Enlist で始まります。The Transaction class defines a set of methods whose names begin with Enlist that provide this functionality. さまざまな Enlist メソッドは、リソース マネージャーが持つ各種の参加リストにそれぞれ対応しています。The different Enlist methods correspond to the different types of enlistment that a resource manager may have.

このクラスは、参加の登録時にトランザクションマネージャーに対して2フェーズコミット通知コールバックを提供するために、リソースマネージャーが実装する必要のあるインターフェイスを表します。This class describes an interface that a resource manager should implement to provide two phase commit notification callbacks for the transaction manager upon enlisting for participation. リソースマネージャー IEnlistmentNotificationがインターフェイスを実装するたびに、リソースが揮発性であるか永続であるかに応じTransactionて、クラスのEnlistVolatileメソッドまたはEnlistDurableメソッドを使用して、そのインターフェイスを参加させる必要があります。For each resource manager's implementation of the IEnlistmentNotification interface, you should enlist it using the EnlistVolatile method or the EnlistDurable method of the Transaction class, depending on whether your resource is volatile or durable. 参加リストと2PC の詳細については、「トランザクション内の参加要素としてのリソースの参加」と「単一フェーズと複数フェーズでのトランザクションのコミット」を参照してください。For more information on enlistment and 2PC, see Enlisting Resources as Participants in a Transaction and Committing a Transaction in Single-Phase and Multi-Phase respectively.

トランザクションマネージャーは、次のメソッドによって、2フェーズコミットプロトコルの異なるフェーズで参加オブジェクトに通知します。The transaction manager notifies the enlisted object at different phases of the Two Phase Commit Protocol by the following methods.

メソッドMethod 説明Description
Prepare 参加しているオブジェクトのこのメソッドは、トランザクションの最初のフェーズでトランザクションマネージャーによってコールバックとして使用されます。トランザクションマネージャーは、トランザクションをコミットできるかどうかを参加者に要求します。This method of an enlisted object is used as a callback by the Transaction Manager during the first phase of a transaction, when the transaction manager asks participants whether they can commit the transaction.
Commit 参加しているオブジェクトのこのメソッドは、トランザクションがコミットされた場合にトランザクションの2番目のフェーズでトランザクションマネージャーによってコールバックとして使用されます。This method of an enlisted object is used as a callback by the Transaction Manager during the second phase of a transaction if the transaction is committed.
Rollback 参加しているオブジェクトのこのメソッドは、トランザクションが中止された場合 (ロールバックされた場合) に、トランザクションマネージャーによってトランザクションマネージャーによってコールバックとして使用されます。This method of an enlisted object is used as a callback by the Transaction Manager during the second phase of a transaction if the transaction is aborted (that is, rolled back).
InDoubt 参加しているオブジェクトのこのメソッドは、トランザクションがインダウトの場合、トランザクションの2番目のフェーズでトランザクションマネージャーによってコールバックとして使用されます。This method of an enlisted object is used as a callback by the Transaction Manager during the second phase of a transaction if the transaction is in doubt.

注意

通知は、順番に、または特定の順序で送信されないことに注意してください。You should be aware that notifications might not be sent sequentially, or in a particular order.

メソッド

Commit(Enlistment) Commit(Enlistment) Commit(Enlistment) Commit(Enlistment)

トランザクションのコミット中であることを参加オブジェクトに通知します。Notifies an enlisted object that a transaction is being committed.

InDoubt(Enlistment) InDoubt(Enlistment) InDoubt(Enlistment) InDoubt(Enlistment)

トランザクションのステータスが未決定であることを参加オブジェクトに通知します。Notifies an enlisted object that the status of a transaction is in doubt.

Prepare(PreparingEnlistment) Prepare(PreparingEnlistment) Prepare(PreparingEnlistment) Prepare(PreparingEnlistment)

トランザクションのコミットの準備中であることを参加オブジェクトに通知します。Notifies an enlisted object that a transaction is being prepared for commitment.

Rollback(Enlistment) Rollback(Enlistment) Rollback(Enlistment) Rollback(Enlistment)

トランザクションのロールバック (中止) 中であることを参加オブジェクトに通知します。Notifies an enlisted object that a transaction is being rolled back (aborted).

適用対象

こちらもご覧ください