Использование Microsoft Transaction Server
Далее отредактируем библиотеку типов данного серверного объекта, создав методы GetPays. AddPay, DelPay для доставки данных клиентскому приложению, добавления и удаления записей, а также метод DoTrans, реализующий распределенную транзакцию (удаление записи о выбранном товаре из таблицы STOCKTABLE в базе данных IBLOCAL и добавление по одной записи в таблицу заказов на доставку delivery.db в базе данных DBDEMOS и в таблицу счетов за заказы ord.dbf в базе данных paydb, рис. 23). Рис. 23. Библиотека типов серверного объекта, управляющего распределенными транзакциями Реализация этих методов имеет следующий вид:
//MTS server for managing distributed transactions
//By N.Elmanova
//04.12.1998
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComServ, ComObj, VCLCom, StdVcl, BdeProv, BdeMts, DataBkr, DBClient,
MtsRdm, Mtx, paysrv_TLB, dels_TLB, st_TLB, DBTables, Provider, Db;
type
Tpays = class(TMtsDataModule, Ipays)
paytable: TTable;
PayProvider: TProvider;
Database3: TDatabase;
Query6: TQuery;
Session3: TSession;
Query5: TQuery;
private
FStockDM1: IStockDM1;
FDelDM: IDelDM;
{ Private declarations }
public
{ Public declarations }
protected
function GetPays: OleVariant; safecall;
procedure AddPay(Pnum: Integer; Pval: Double; const Address: WideString);
safecall;
procedure DelPay(Pnum: Integer); safecall;
procedure DoTrans(Num: Integer; Val: Double; const Addr,
Gname: WideString); safecall;
end;
var
pays: Tpays;
implementation
{$R *.DFM}
function Tpays.GetPays: OleVariant;
begin
Result:=PayProvider.Data;
SetComplete;
end;
procedure Tpays.AddPay(Pnum: Integer; Pval: Double;
const Address: WideString);
begin
try
paytable.open;
paytable.append;
paytable.fieldbyname('OrdNum').Value:=PNum;
paytable.fieldbyname('Payment').Value:=Pval;
paytable.fieldbyname('Address').Value:=Address;
paytable.post;
paytable.close;
SetComplete;
except
SetAbort;
end;
end;
procedure Tpays.DelPay(Pnum: Integer);
begin
try
Database3.Open;
paytable.Open;
paytable.SetRangeStart;
paytable.FieldByName('ordnum').AsInteger:=Pnum;
paytable.SetRangeEnd;
paytable.FieldByName('ordnum').AsInteger:=Pnum;
paytable.ApplyRange;
paytable.Delete;
paytable.Close;
Database3.Close;
SetComplete;
except
SetAbort;
raise;
end;
end;
procedure Tpays.DoTrans(Num: Integer; Val: Double; const Addr,
Gname: WideString);
begin
try
OleCheck(ObjectContext.CreateInstance(CLASS_StockDM1, IStockDM1, FStockDM1));
OleCheck(ObjectContext.CreateInstance(CLASS_DelDM, IDelDM, FDelDM));
FStockDM1.DeleteGoods(Num);
FDelDM.AddDelivery(Num,Gname,Addr);
AddPay(Num,Val,Addr);
except
DisableCommit;
raise;
end;
EnableCommit;
end;
initialization
TComponentFactory.Create(ComServer, Tpays,
Class_pays, ciMultiInstance, tmApartment);
end.
Прокомментируем приведенный выше код для метода DoTrans. Этот код реализует распределенную транзакцию, вызывая методы двух порожденных ей серверных объектов и выполняя собственные манипуляции с таблицей счетов. При вызове метода DoTrans клиентским приложением все три серверных объекта функционируют согласованно.
Отправить комментарий