经过试验,有两种方式:
一、事物处理的原理
不论两层或三层体系,事物处理都是通过两阶段提交实现的。在第一阶段,每个执行的的资源/记录被写入 事物环境(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创建,过程同上。
我在实验过程中,建议用第二种,第一种方式错误很多,而且写的也很麻烦。