Compensator クラス

定義

すべての CRM (Compensating Resource Manager) Compensator の基本クラスを表します。Represents the base class for all Compensating Resource Manager (CRM) Compensators.

public ref class Compensator : System::EnterpriseServices::ServicedComponent
public class Compensator : System.EnterpriseServices.ServicedComponent
type Compensator = class
    inherit ServicedComponent
Public Class Compensator
Inherits ServicedComponent
継承

次のコード例は、このクラスの使用方法を示しています。The following code example demonstrates the use of this class.

// A CRM Compensator
public ref class AccountCompensator : public Compensator
{
private:
    bool receivedPrepareRecord;

public:
    AccountCompensator()
    {
        receivedPrepareRecord = false;
    } 

public:
    virtual void BeginPrepare() override 
    {
        // nothing to do
    }

public:
    virtual bool PrepareRecord(LogRecord^ log) override 
    {

        // Check the validity of the record.
        if (log == nullptr)
        {
            return false;
        }
        array<Object^>^ record = dynamic_cast<array<Object^>^>(log->Record);
        if (record == nullptr)
        {
            return false;
        }
        if (record->Length != 2)
        {
            return false;
        }

        // The record is valid.
        receivedPrepareRecord = true;
        return true;              
    }

public:
    virtual bool EndPrepare() override
    {
        // Allow the transaction to proceed onlyif we have received a prepare
        // record.
        if (receivedPrepareRecord)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

public:
    virtual void BeginCommit(bool commit) override
    {
        // nothing to do
    }

public:
    virtual bool CommitRecord(LogRecord^ log) override
    {
        // nothing to do
        return(false);
    }

public:
    virtual void EndCommit() override
    {
        // nothing to do
    }

public:
    virtual void BeginAbort(bool abort) override
    {
        // nothing to do
    }

public:
    virtual bool AbortRecord(LogRecord^ log) override
    {

        // Check the validity of the record.
        if (log == nullptr)
        {
            return true;
        }
        array<Object^>^ record = dynamic_cast<array<Object^>^>(log->Record);
        if (record == nullptr)
        {
            return true;
        }
        if (record->Length != 2)
        {
            return true;
        }

        // Extract old account data from the record.
        String^ filename = (String^) record[0];
        int balance = (int) record[1];

        // Restore the old state of the account.
        WriteAccountBalance(filename, balance);

        return false;
    }

public:
    virtual void EndAbort() override
    {
        // nothing to do
    }    

};
// A CRM Compensator
public class AccountCompensator : Compensator
{

    private bool receivedPrepareRecord = false;

    public override void BeginPrepare ()
    {
        // nothing to do
    }

    public override bool PrepareRecord (LogRecord log)
    {

        // Check the validity of the record.
        if (log == null) return(true);
        Object[] record = log.Record as Object[];
        if (record == null) return(true);
        if (record.Length != 2) return(true);

        // The record is valid.
        receivedPrepareRecord = true;
        return(false);
    }

    public override bool EndPrepare ()
    {
        // Allow the transaction to proceed onlyif we have received a prepare record.
        if (receivedPrepareRecord)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }

    public override void BeginCommit (bool commit)
    {
        // nothing to do
    }

    public override bool CommitRecord (LogRecord log)
    {
        // nothing to do
        return(false);
    }

    public override void EndCommit ()
    {
        // nothing to do
    }

    public override void BeginAbort (bool abort)
    {
        // nothing to do
    }

    public override bool AbortRecord (LogRecord log)
    {

        // Check the validity of the record.
        if (log == null) return(true);
        Object[] record = log.Record as Object[];
        if (record == null) return(true);
        if (record.Length != 2) return(true);

        // Extract old account data from the record.
        string filename = (string) record[0];
        int balance = (int) record[1];

        // Restore the old state of the account.
        AccountManager.WriteAccountBalance(filename, balance);

        return(false);
    }

    public override void EndAbort ()
    {
        // nothing to do
    }
}
' A CRM Compensator

Public Class AccountCompensator
    Inherits Compensator
    
    Private receivedPrepareRecord As Boolean = False
    
    
    Public Overrides Sub BeginPrepare() 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function PrepareRecord(ByVal log As LogRecord) As Boolean 
        
        ' Check the validity of the record.
        If log Is Nothing Then
            Return True
        End If
        Dim record As [Object]() = log.Record
        
        If record Is Nothing Then
            Return True
        End If
        If record.Length <> 2 Then
            Return True
        End If 
        ' The record is valid.
        receivedPrepareRecord = True
        Return False
    
    End Function 'PrepareRecord
    
    Public Overrides Function EndPrepare() As Boolean 
        ' Allow the transaction to proceed onlyif we have received a prepare record.
        If receivedPrepareRecord Then
            Return True
        Else
            Return False
        End If
    
    End Function 'EndPrepare
    
    Public Overrides Sub BeginCommit(ByVal commit As Boolean) 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function CommitRecord(ByVal log As LogRecord) As Boolean 
        ' nothing to do
        Return False
    
    End Function 'CommitRecord
    
    Public Overrides Sub EndCommit() 
    
    End Sub
    
    ' nothing to do
    Public Overrides Sub BeginAbort(ByVal abort As Boolean) 
    
    End Sub
    
    ' nothing to do
    Public Overrides Function AbortRecord(ByVal log As LogRecord) As Boolean 
        
        ' Check the validity of the record.
        If log Is Nothing Then
            Return True
        End If
        Dim record As [Object]() = log.Record
        
        If record Is Nothing Then
            Return True
        End If
        If record.Length <> 2 Then
            Return True
        End If 
        ' Extract old account data from the record.
        Dim filename As String = CStr(record(0))
        Dim balance As Integer = Fix(record(1))
        
        ' Restore the old state of the account.
        AccountManager.WriteAccountBalance(filename, balance)
        
        Return False
    
    End Function 'AbortRecord
    
    Public Overrides Sub EndAbort() 
    
    End Sub
End Class

このコンペンセーターは、次のワーカークラスによって使用されます。This compensator is used by the following worker class.

// A CRM Worker
[Transaction]
public ref class Account : public ServicedComponent
{

    // A data member for the account file name.
private:
    String^ filenameValue;

public:
    property String^ Filename
    {
        String^ get()
        {
            return filenameValue;
        }
        void set( String^ value )
        {
            filenameValue = value;
        }
    }

    // A boolean data member that determines whether to commit or abort the 
    // transaction.
private:
    bool allowCommitValue;

public:
    property bool AllowCommit
    {
        bool get()
        {
            return allowCommitValue;
        }
        void set( bool value )
        {
            allowCommitValue = value;
        }
    }

    // Debit the account, 
public:
    void DebitAccount(int amount)
    {

        // Create a new clerk using the AccountCompensator class.
        Clerk^ clerk = gcnew Clerk(AccountCompensator::typeid,
            "An account transaction compensator", CompensatorOptions::AllPhases);

        // Create a record of previous account status, and deliver it to the
        // clerk.
        int balance = ReadAccountBalance(Filename);

        array<Object^>^ record = gcnew array<Object^>(2);
        record[0] = Filename;
        record[1] = balance;

        clerk->WriteLogRecord(record);
        clerk->ForceLog();

        // Perform the transaction
        balance -= amount;

        Console::WriteLine("{0}: {1}", Filename, balance);

        WriteAccountBalance(Filename, balance);

        // Commit or abort the transaction 
        if (AllowCommit)
        {
            ContextUtil::SetComplete();
        }
        else
        {
            ContextUtil::SetAbort();
        }

    }

};
// A CRM Worker
[Transaction]
public class Account : ServicedComponent
{

    // A data member for the account file name.
    private string filename;

    public string Filename
    {
        get
        {
            return(filename);
        }
        set
        {
            filename = value;
        }
    }

    // A boolean data member that determines whether to commit or abort the transaction.
    private bool commit;

    public bool AllowCommit
    {
        get
        {
            return(commit);
        }
        set
        {
            commit = value;
        }
    }

    // Debit the account,
    public void DebitAccount (int ammount)
    {

        // Create a new clerk using the AccountCompensator class.
        Clerk clerk = new Clerk(typeof(AccountCompensator),
          "An account transaction compensator", CompensatorOptions.AllPhases);

        // Create a record of previous account status, and deliver it to the clerk.
        int balance = AccountManager.ReadAccountBalance(filename);

    Object[] record = new Object[2];
    record[0] = filename;
        record[1] = balance;

        clerk.WriteLogRecord(record);
        clerk.ForceLog();

        // Perform the transaction
        balance -= ammount;
        AccountManager.WriteAccountBalance(filename, balance);

        // Commit or abort the transaction
        if (commit)
        {
            ContextUtil.SetComplete();
        }
        else
        {
            ContextUtil.SetAbort();
        }
    }
}
' A CRM Worker
<Transaction()>  _
Public Class Account
    Inherits ServicedComponent
    
    ' A data member for the account file name.
    Private filename As String
    
    
    Public Property Filenam() As String
        Get
            Return Filename
        End Get
        Set(ByVal value As String)
            filename = Value
        End Set
    End Property
    
    
    ' A boolean data member that determines whether to commit or abort the transaction.
    Private commit As Boolean
    
    
    Public Property AllowCommit() As Boolean 
        Get
            Return commit
        End Get
        Set
            commit = value
        End Set
    End Property
    
    
    
    
    ' Debit the account, 
    Public Sub DebitAccount(ByVal ammount As Integer) 
        
        ' Create a new clerk using the AccountCompensator class.
        Dim clerk As New Clerk(GetType(AccountCompensator), "An account transaction compensator", CompensatorOptions.AllPhases)
        ' Create a record of previous account status, and deliver it to the clerk.
        Dim balance As Integer = AccountManager.ReadAccountBalance(Filenam)
        
        Dim record(1) As [Object]
        record(0) = filename
        record(1) = balance
        
        clerk.WriteLogRecord(record)
        clerk.ForceLog()
        ' Perform the transaction
        balance -= ammount
        AccountManager.WriteAccountBalance(filename, balance)
        
        ' Commit or abort the transaction 
        If commit Then
            ContextUtil.SetComplete()
        Else
            ContextUtil.SetAbort()
        End If
    End Sub
    
End Class

次のコード例は、このコンペンセーターとワーカーを演習するクライアントを示しています。The following code example demonstrates a client that exercises this compensator and worker.

#using "System.EnterpriseServices.dll"

using namespace System;

[assembly: System::Reflection::AssemblyKeyFile("CrmServer.key")];

int main ()
{

    // Create a new account object. The object is created in a COM+ server application.
    Account^ account = gcnew Account();

    // Transactionally debit the account.
    try
    {
        account->Filename = System::IO::Path::GetFullPath("JohnDoe");
        account->AllowCommit = true;
        account->DebitAccount(3);
    }
    finally
    {
        delete account;
    }

}
using System;

public class CrmClient
{

    public static void Main ()
    {

        // Create a new account object. The object is created in a COM+ server application.
        Account account = new Account();

        // Transactionally debit the account.
        try
        {
            account.Filename = System.IO.Path.GetFullPath("JohnDoe");
            account.AllowCommit = true;
            account.DebitAccount(3);
        }
        finally
        {
            account.Dispose();
        }
    }
}
Public Class CrmClient
    
    
    Public Shared Sub Main() 
        
        ' Create a new account object. The object is created in a COM+ server application.
        Dim account As New Account()
        
        ' Transactionally debit the account.
        Try
            account.Filenam = System.IO.Path.GetFullPath("JohnDoe")
            account.AllowCommit = True
            account.DebitAccount(3)
        Finally
            account.Dispose()
        End Try
    
    End Sub
End Class

注釈

ユーザーは、カスタムトランザクションコンペンセーターを作成するために、このオブジェクトから拡張する必要があります。The user should extend from this object in order to write a custom transaction Compensator.

コンペンセーターには、常にパブリックコンストラクターが必要です。それ以外の場合、復旧エンジンは作成できません。A Compensator must always have a public constructor; otherwise, the recovery engine cannot create it.

詳細については、「 方法: 補正リソースマネージャー (CRM) を作成する」を参照してください。For more information, see How to: Create a Compensating Resource Manager (CRM).

コンストラクター

Compensator()

Compensator クラスの新しいインスタンスを初期化します。Initializes a new instance of the Compensator class.

プロパティ

Clerk

CRM Clerk オブジェクトを表す値を取得します。Gets a value representing the Compensating Resource Manager (CRM) Clerk object.

メソッド

AbortRecord(LogRecord)

中止フェーズ時に CRM Compensator にログ レコードを配信します。Delivers a log record to the Compensating Resource Manager (CRM) Compensator during the abort phase.

Activate()

オブジェクトが作成されるかプールから割り当てられるときにインフラストラクチャによって呼び出されます。Called by the infrastructure when the object is created or allocated from a pool. カスタム初期化コードをオブジェクトに追加するには、このメソッドをオーバーライドします。Override this method to add custom initialization code to objects.

(継承元 ServicedComponent)
BeginAbort(Boolean)

トランザクションの完了が中止フェーズに入ったことと、今後のレコード配信について、CRM Compensator に通知します。Notifies the Compensating Resource Manager (CRM) Compensator of the abort phase of the transaction completion, and the upcoming delivery of records.

BeginCommit(Boolean)

トランザクションの完了がコミット フェーズに入ったことと、今後のレコード配信について、CRM Compensator に通知します。Notifies the Compensating Resource Manager (CRM) Compensator of the commit phase of the transaction completion and the upcoming delivery of records.

BeginPrepare()

トランザクションの完了が準備フェーズに入ったことと、今後のレコード配信について、CRM Compensator に通知します。Notifies the Compensating Resource Manager (CRM) Compensator of the prepare phase of the transaction completion and the upcoming delivery of records.

CanBePooled()

このメソッドは、オブジェクトがプールに戻される前にインフラストラクチャによって呼び出されます。This method is called by the infrastructure before the object is put back into the pool. オブジェクトがプールに戻されるかどうかを断定するには、このメソッドをオーバーライドします。Override this method to vote on whether the object is put back into the pool.

(継承元 ServicedComponent)
CommitRecord(LogRecord)

コミット フェーズ時にログ レコードを転送順に配信します。Delivers a log record in forward order during the commit phase.

Construct(String)

コンストラクターが呼び出された直後にインフラストラクチャによって呼び出されて、コンストラクター文字列を渡します。Called by the infrastructure just after the constructor is called, passing in the constructor string. 構築文字列値を使用するには、このメソッドをオーバーライドします。Override this method to make use of the construction string value.

(継承元 ServicedComponent)
CreateObjRef(Type)

リモート オブジェクトとの通信に使用するプロキシの生成に必要な情報をすべて格納しているオブジェクトを作成します。Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(継承元 MarshalByRefObject)
Deactivate()

オブジェクトが非アクティブになる直前にインフラストラクチャによって呼び出されます。Called by the infrastructure when the object is about to be deactivated. ジャスト イン タイム (JIT: Just-In-Time) のコンパイル コードまたはオブジェクト プーリングを使用する場合にカスタム終了コードを追加するには、このメソッドをオーバーライドします。Override this method to add custom finalization code to objects when just-in-time (JIT) compiled code or object pooling is used.

(継承元 ServicedComponent)
Dispose()

ServicedComponent によって使用されているすべてのリソースを解放します。Releases all resources used by the ServicedComponent.

(継承元 ServicedComponent)
Dispose(Boolean)

ServicedComponent によって使用されているアンマネージド リソースを解放し、オプションでマネージド リソースも解放します。Releases the unmanaged resources used by the ServicedComponent and optionally releases the managed resources.

(継承元 ServicedComponent)
EndAbort()

CRM Compensator に、中止フェーズ時に使用できるすべてのログ レコードを受信したことを通知します。Notifies the Compensating Resource Manager (CRM) Compensator that it has received all the log records available during the abort phase.

EndCommit()

CRM Compensator に、コミット フェーズ時に使用できるすべてのログ レコードが配信されたことを通知します。Notifies the Compensating Resource Manager (CRM) Compensator that it has delivered all the log records available during the commit phase.

EndPrepare()

CRM Compensator に、準備フェーズ時に使用できるすべてのログ レコードが用意されたことを通知します。Notifies the Compensating Resource Manager (CRM) Compensator that it has had all the log records available during the prepare phase.

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(継承元 Object)
GetLifetimeService()
互換性のために残されています。

対象のインスタンスの有効期間ポリシーを制御する、現在の有効期間サービス オブジェクトを取得します。Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(継承元 MarshalByRefObject)
GetType()

現在のインスタンスの Type を取得します。Gets the Type of the current instance.

(継承元 Object)
InitializeLifetimeService()
互換性のために残されています。

このインスタンスの有効期間ポリシーを制御する有効期間サービス オブジェクトを取得します。Obtains a lifetime service object to control the lifetime policy for this instance.

(継承元 MarshalByRefObject)
MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(継承元 Object)
MemberwiseClone(Boolean)

現在の MarshalByRefObject オブジェクトの簡易コピーを作成します。Creates a shallow copy of the current MarshalByRefObject object.

(継承元 MarshalByRefObject)
PrepareRecord(LogRecord)

準備フェーズ時にログ レコードを転送順に配信します。Delivers a log record in forward order during the prepare phase.

ToString()

現在のオブジェクトを表す文字列を返します。Returns a string that represents the current object.

(継承元 Object)

明示的なインターフェイスの実装

IRemoteDispatch.RemoteDispatchAutoDone(String)

この API は製品インフラストラクチャをサポートします。コードから直接使用するものではありません。

COM+ コンテキストで、リモート メソッド呼び出しの後に、ServicedComponent クラス オブジェクトの done ビットが true に設定されるようにします。Ensures that, in the COM+ context, the ServicedComponent class object's done bit is set to true after a remote method invocation.

(継承元 ServicedComponent)
IRemoteDispatch.RemoteDispatchNotAutoDone(String)

COM+ コンテキストで、リモート メソッド呼び出しの後に、ServicedComponent クラス オブジェクトの done ビットが true に設定されるとは限りません。Does not ensure that, in the COM+ context, the ServicedComponent class object's done bit is set to true after a remote method invocation.

(継承元 ServicedComponent)
IServicedComponentInfo.GetComponentInfo(Int32, String[])

ServicedComponent クラス インターフェイスに関する特定の情報を取得します。Obtains certain information about the ServicedComponent class instance.

(継承元 ServicedComponent)

適用対象