Использование Microsoft Transaction Server

В начале выполнения создается так называемый контекст транзакции - интерфейс ITransactionContextEx. Этот интерфейс контролирует выполнение транзакции и обладает методами CreateInstance (создание экземпляра порожденного объекта), Commit (завершение транзакции) и Abort (откат транзакции). Отметим, что если для порождения серверного объекта MTS клиентским приложением используется компонент TDCOMConnection, то для порождения серверного объекта другим серверным объектом используется вызов метода CreateInstance интерфейса ITransactionContextEx. Параметрами этого метода являются CLSID объекта, интерфейс объекта и указатель на объект (возвращаемый параметр). Далее следуют вызовы методов порожденных серверных объектов и собственные манипуляции с данными. Если все операции были успешны, транзакция завершена, и может быть выполнен метод Commit интерфейса ITransactionContextEx. Если же операции были неуспешны, и в одном или обоих порожденных серверах либо во время собственных манипуляций с данными возникнут исключения (например, другой пользователь уже удалил запись из списка товаров, сделав заказ, или какая-то из таблиц заблокирована), будет вызван метод Abort. Для тестирования распределенных транзакций установим все три серверных объекта в один и тот же "пакет" (рис. 24): clip0122 Рис. 24. Серверные объекты, участвующие в распределенной транзакции 6.2. Создание клиентского приложения, использующего распределенные транзакции Для тестирования созданного ранее сервера и инициации распределенных транзакций создадим клиентское приложение, имитирующее процесс оформления заказов. На главной форме приложения поместим кнопку с надписью "Connect", три компонента TDCOMConnection, связанные с соответствующими серверами, три компонента TClientDataSet, связанные с соответствующими компонентами TDCOMConnection, три компонента TDataSource, связанные с компонентами TClientDataSet и блокнот из двух страниц. На одной из страниц блокнота разместим компонент TDBGrid, отображающий данные из таблицы со списком товаров на складе, компонент TEdit для ввода пользователем адреса доставки, и кнопку для инициирования транзакции - принятия заказа. На второй странице поместим два компонента TDBGrid для отображения данных из двух других таблиц и компонент TSplitter между ними (рис. 25): clip0123 Рис. 25. Клиентское приложение для тестирования распределенных транзакций Создадим обработчики событий, связанных с нажатием на кнопки:

unit allcl1;
//Client application for using distributed transactions
//By N.Elmanova
//05.12.1998
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids, DBGrids, Db, DBClient, StdCtrls, MConnect, ExtCtrls, ComCtrls;
type
 TForm1 = class(TForm)
  PageControl1: TPageControl;
  TabSheet1: TTabSheet;
  TabSheet2: TTabSheet;
  DCOMConnection1: TDCOMConnection;
  ClientDataSet1: TClientDataSet;
  DataSource1: TDataSource;
  DBGrid1: TDBGrid;
  Edit1: TEdit;
  Label1: TLabel;
  Button1: TButton;
  DBGrid2: TDBGrid;
  DBGrid3: TDBGrid;
  Splitter1: TSplitter;
  DCOMConnection2: TDCOMConnection;
  ClientDataSet2: TClientDataSet;
  DataSource2: TDataSource;
  DCOMConnection3: TDCOMConnection;
  ClientDataSet3: TClientDataSet;
  DataSource3: TDataSource;
  Button2: TButton;
  procedure Button1Click(Sender: TObject);
  procedure Button2Click(Sender: TObject);
 private
  { Private declarations }
 public
  { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var n:integer;val:double;gnam,addr:widestring;
begin
try
 n:= ClientDataSet1.FieldByName('GOODSNUMBER').Value;
 val:= ClientDataSet1.FieldByName('PRICE').Value;
 gnam:= ClientDataSet1.FieldByName('GOODSNAME').Value;
 addr:=Edit1.Text;
 DcomConnection2.Connected:=true;
 DCOMConnection2.AppServer.DoTrans(n,val,addr,gnam);
 ShowMessage('Заказ принят');
except
 ShowMessage('Заказ не принят ');
end;
DcomConnection2.Connected:=false;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DCOMConnection1.Connected:=true;
DCOMConnection2.Connected:=true;
DCOMConnection3.Connected:=true;
CLientdataset1.data:=Dcomconnection1.Appserver.GetGoods;
CLientdataset2.data:=Dcomconnection2.Appserver.GetPays;
CLientdataset3.data:=Dcomconnection3.Appserver.GetDelivery;
DCOMCOnnection1.Connected:=false;
DCOMCOnnection2.Connected:=false;
DCOMCOnnection3.Connected:=false;
end;
end.

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...