三层结构的事务处理问题(100分)

  • 主题发起人 主题发起人 ods
  • 开始时间 开始时间
O

ods

Unregistered / Unconfirmed
GUEST, unregistred user!
在三层结构下如何实现象DataBase一样的事务处理(StartTransaction)。
我需要在Client端同时ApplyUpdates三个表,如果有一个失败,三个表
同时Rollback。可是我现在该如何做啊!!拜托给个例子,谢谢。
 
如果用ADO的话,ADO自己会处理的。
将Dataset Provider的ResolveToDataSet设为True,让ADO来负责更新这些数据。
 
在服务器端做三个程序:
begin
transaction
rollback
commit
然后实现
 
我問過李維﹐他說這是正常的﹐Midas會自動維護一個事務,如果自己控制事務﹐
要改Provider的源碼﹐好象他那本ADO那樣。不過我最近還沒時間去試
 
1、用midas时,利用ADO的事务处理。begin
Trans,EndTrans.可以控制的;
2、用MTS时,可以创建一个新事务,或者直接选择需要事务即可。
请多交流!
 
经过试验,有两种方式:
一、事物处理的原理
不论两层或三层体系,事物处理都是通过两阶段提交实现的。在第一阶段,每个执行的的资源/记录被写入 事物环境(Transcation Context)中,然后资源协调者顺序查询每一个参与事物的执行是否成功,如果都没有问题的话,就进入第二阶段,每个执行都开始Commit它的操作。如果有一个执行有问题的话,资源协调者通知所有下属的执行放弃Commit,恢复数据原状态。
由上可知,执行事物处理有三个要素:资源协调者,事物环境和事物参与者,其中事物环境是关键。

二、两层体系和三层体系的区别

虽然两层体系和三层体系的事物原理是一样的,但是三层体系采用了不同于两层的事物处理方式,区别描述如下。
(一)、两层体系:
两层体系下,典型的事物处理语句如下:
//声明
DB:TDataBase;

DB.StartTranscation;
Try
//数据语句
DB.Commit;
Except
DB.RoolBack;
end;

两层体系的事物从客户端启动,通过数据库对象实现。当然,如果执行的语句是一次完成的,集中的SQL语句也是以事物方式处理的。
两层体系的资源协调者是由数据库,在Delphi中,TDatabase 和 TQuery 都可以通知它建立事物环境,进而形成事物处理。不同的是TQuery本身是事物的参与者,所有的事物执行都必须集中在TQuery.SQL中。
(二)、三层体系:
三层体系下,事物环境的建立有两种方式:事物对象方式和程序方式。
假设客户端为 Client.exe,协调对象 CoConcert.dll,功能对象 CoDB1,CoDB2;事物调用的路径是
Client---CoConcert|-Codb1
|-CoDB2
事物通过协调对象 CoConcert启动。

对于事物对象方式,要求如下:
1)CoConcert 的事物模式为:要求事物 或 要求一个新事物
2)CoDB1,CoDB2的事物模式为:要求事物
3)对所有对象的功能调用都要进行 setComplete 或 SetAbort 调用。
典型的事物处理语句如下:
CoConcert 中:

Try
CoDB1:=CoCoDB1.Create;
CoDB1.Method1;
CoDB1:=Nil;

CoDB2:=CoCoDB2.Create;
CoDB2.Method1;
CoDB2:=Nil;

SetComplete;
Except
SetAbort;
end;

CoDB1的Method1方法中
Try
//数据处理语句
SetComplete;
Except
SetAbort;
end;

对于程序方式,要求如下:
1)CoConcert 的事物模式为:支持事物
2)CoDB1,CoDB2的事物模式为:支持事物
3)对协调对象的功能调用进行 setComplete 或 SetAbort 调用。
典型的事物处理语句如下:
CoConcert 中:
TransEx:ITranscationContextEx;
CoDB1:ICoDB1;
CoDB2:ICoDB2;

TransEx:=CreateTranscationContextEx;
Try
Olecheck(TransEx,Class_CoDB1,IID_CoDB1,CoDB1);
CoDB1.Method1;
CoDB1:=nil;

Olecheck(TransEx,Class_CoDB2,IID_CoDB2,CoDB2);
CoDB2.Method1;
CoDB2:=nil;

Except
TransEx.Abort;
end;
TransEx.Commit;

CoDB1的Method1方法中:
//数据处理语句

三层体系中,资源协调者是由所有支持两阶段提交协议的程序共同担任的,事物环境被创建在当前的MTS或COM+管理器中(win2000).
当然,事物也可以有客户Client.Exe创建,过程同上。

我在实验过程中,建议用第二种,第一种方式错误很多,而且写的也很麻烦。
 
将你的数据(delta)包传递到服务器,在服务器来进行事务处理,这样效率比较
高,(相对于在客户端开始一个事务),有源码
 
你同时操作三个表是不是应该作成服务放在
应用服务器上执行,这样事物控制的问题
不就和C/S的一样了吗?
 
一个事务开始要锁定大量的计算机资源,并且并发性降低,将事务放在应用服务器
可以减少事务锁定资源时间,放在客户端事务锁定资源时间将变得更长(需要更多的
网络round...)
 
tanglu 的方法正确。
 
把事务处理放到中间层,就不会有问题的。
可以回滚。
 
写一个远程方法
形式为:
procedure trandelta(data1,data2,data3:olevariant);
begin
adoconnection1.begin
tran;
datasetprovider1.as_applyupdates(data1,...);//可以用ado控件直接完成数据更新
datasetprovider1.as_applyupdates(data2,...);
datasetprovider1.as_applyupdates(data3,...);
if adoerrors.item.count=0 then
adoconnection1.commit
else
begin
adoconnection1.roolback;
sysutls.abort;
end;


end;
注: 若同时更新多条记录,你要参考midas的处理方式
逐条处理
 
后退
顶部