Compensator 类
表示所有补偿资源管理器 (CRM) 补偿器的基类。
**命名空间:**System.EnterpriseServices.CompensatingResourceManager
**程序集:**System.EnterpriseServices(在 system.enterpriseservices.dll 中)
语法
声明
Public Class Compensator
Inherits ServicedComponent
用法
Dim instance As Compensator
public class Compensator : ServicedComponent
public ref class Compensator : public ServicedComponent
public class Compensator extends ServicedComponent
public class Compensator extends ServicedComponent
备注
用户应从该对象扩展以便编写自定义事务补偿器。
补偿器必须始终具有公共构造函数;否则,恢复引擎不能创建它。
有关更多信息,请参见 如何:创建补偿资源管理器 (CRM)。
示例
下面的代码示例演示如何使用该类。
' 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
// 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 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 extends Compensator
{
private boolean receivedPrepareRecord = false;
public void BeginPrepare()
{
// nothing to do
} //BeginPrepare
public boolean PrepareRecord(LogRecord log)
{
// Check the validity of the record.
if (log == null) {
return true;
}
Object record[] = new Object[] { log.get_Record() };
if (record == null) {
return true;
}
if (record.get_Length() != 2) {
return true;
}
// The record is valid.
receivedPrepareRecord = true;
return false;
} //PrepareRecord
public boolean EndPrepare()
{
// Allow the transaction to proceed onlyif we have received
// a prepare record.
if (receivedPrepareRecord) {
return true;
}
else {
return false;
}
} //EndPrepare
public void BeginCommit(boolean commit)
{
// nothing to do
} //BeginCommit
public boolean CommitRecord(LogRecord log)
{
// nothing to do
return false;
} //CommitRecord
public void EndCommit()
{
// nothing to do
} //EndCommit
public void BeginAbort(boolean abort)
{
// nothing to do
} //BeginAbort
public boolean AbortRecord(LogRecord log)
{
// Check the validity of the record.
if (log == null) {
return true;
}
Object record[] = new Object[] { log.get_Record() };
if (record == null) {
return true;
}
if (record.get_Length() != 2) {
return true;
}
// Extract old account data from the record.
String fileName = (String)(record.get_Item(0));
int balance = System.Convert.ToInt32(record[1]);
// Restore the old state of the account.
AccountManager.WriteAccountBalance(fileName, balance);
return false;
} //AbortRecord
public void EndAbort()
{
// nothing to do
} //EndAbort
} //AccountCompensator
此补偿器由下面的辅助类使用。
' 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 Class 'Account
// 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 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
/** @attribute Transaction()
*/
public class Account extends ServicedComponent
{
// A data member for the account file name.
/** @property
*/
private String fileName;
public String get_fileName()
{
return fileName;
} //get_fileName
public void set_fileName(String value)
{
fileName = value;
} //set_fileName
// A boolean data member that determines whether to commit or
// abort the transaction.
private boolean commit;
/** @property
*/
public boolean get_AllowCommit()
{
return commit;
} //get_AllowCommit
/** @property
*/
public void set_AllowCommit(boolean value)
{
commit = value;
} //set_AllowCommit
// Debit the account,
public void DebitAccount(int ammount)
{
// Create a new clerk using the AccountCompensator class.
Clerk clerk = new Clerk(AccountCompensator.class.ToType(),
"An account transaction compensator",
CompensatorOptions.AllPhases);
// Create a record of previous account status, and deliver
// it to the clerk.
Console.WriteLine("filename = " + fileName);
int balance = AccountManager.ReadAccountBalance(fileName);
Object record[] = new Object[2];
record.set_Item(0, fileName);
record.set_Item(1,(Int32)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();
}
} //DebitAccount
} //Account
下面的代码示例演示一个试验此补偿器和辅助类的客户端。
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
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();
}
}
}
#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;
}
}
import System.*;
public class CrmClient
{
public static void main(String[] args)
{
// Create a new account object. The object is created in a COM+
// server application.
Account account = new Account();
// Transactionally debit the account.
try {
account.set_fileName(System.IO.Path.GetFullPath("JohnDoe"));
account.set_AllowCommit(true);
account.DebitAccount(3);
}
finally {
account.Dispose();
}
} //main
} //CrmClient
继承层次结构
System.Object
System.MarshalByRefObject
System.ContextBoundObject
System.EnterpriseServices.ServicedComponent
System.EnterpriseServices.CompensatingResourceManager.Compensator
线程安全
此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。
平台
Windows 98、Windows 2000 SP4、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition
.NET Framework 并不是对每个平台的所有版本都提供支持。有关受支持版本的列表,请参见系统要求。
版本信息
.NET Framework
受以下版本支持:2.0、1.1、1.0
请参见
参考
Compensator 成员
System.EnterpriseServices.CompensatingResourceManager 命名空间