Compensator Class
Represents the base class for all Compensating Resource Manager (CRM) Compensators.
Assembly: System.EnterpriseServices (in System.EnterpriseServices.dll)
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.
For more information, see How to: Create a Compensating Resource Manager (CRM).
The following code example demonstrates the use of this class.
' A CRM Compensator Public Class AccountCompensator Inherits Compensator Private receivedPrepareRecord As Boolean = False Public Overrides Sub BeginPrepare() End Sub 'BeginPrepare ' 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 'BeginCommit ' 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 'EndCommit ' nothing to do Public Overrides Sub BeginAbort(ByVal abort As Boolean) End Sub 'BeginAbort ' 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 'EndAbort End Class 'AccountCompensator ' nothing to do
This compensator is used by the following worker class.
' 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 'DebitAccount ' End Class 'Account
The following code example demonstrates a client that exercises this compensator and worker.
Imports System 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 'Main End Class 'CrmClient
System.MarshalByRefObject
System.ContextBoundObject
System.EnterpriseServices.ServicedComponent
System.EnterpriseServices.CompensatingResourceManager.Compensator
Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.