private
isRootTrans:Boolean; //是否是根事务
isNeedTrans:Boolean; //是否需要事务
public
DBOperate:TDBOperate_DL; //操作数据库的类的实例
procedure SetComplete;
procedure SetAbort;
constructor Create(const newDBOperate:TDBOperate_DL;needTrans:Boolean);//是否需要事务支持
destructor Destroy;override;
end;
在该类创建时,除了传递进操作数据库的类的实例外,再传入一个是否需要事务的标志,因为如果是只做读取数据库的操作,就用不着事务了。
类实现代码如下:
constructor TTS_DL.Create(const newDBOperate: TDBOperate_DL;
needTrans: Boolean);
begin
inherited Create;
self.DBOperate := newDBOperate;
self.isNeedTrans := needTrans; //赋值是否需要事务
if self.isNeedTrans then
begin
//如果在事务里,就不是根事务,保留事务上下文里isCommit的值不变
if self.DBOperate.isInTrans then
self.isRootTrans := false
else
begin
self.DBOperate.BeginTrans; //是根事务,就开始事务
self.isRootTrans := true;
self.DBOperate.isCommit := true; //初始化提交标志为要提交事务
end;
end;
end;
destructor TTS_DL.Destroy;
begin
if self.isNeedTrans then
begin
//如果是根事务,就按照投票结果进行事务提交或回滚
if self.isRootTrans then
begin
if self.DBOperate.isCommit then
self.DBOperate.CommitTrans
else
self.DBOperate.RollbackTrans;
end;
end;
inherited;
end;
procedure TTS_DL.SetAbort;
begin
self.DBOperate.isCommit := self.DBOperate.isCommit And false; //投票说要回滚
end;
procedure TTS_DL.SetComplete;
begin
self.DBOperate.isCommit := self.DBOperate.isCommit And true; //投票说要提交
end;
回到刚才的业务类Tthing和Tperson,这次都从TTS_DL类继承下来。
Tthing = class(TTS_DL);
Tperson = class(TTS_DL);
Tthing的删除代码该为如下:
procedure Tthing.Drop(const thing:String);
var
sqlString:String;
begin
sqlString := 删除的SQL语句;
try
self. DBOperate.Execute(sqlString);
self. DBOperate.SetComplete; //投票提交
except
self. DBOperate.SetAbort; //投票回滚
raise;
end;
end;
Tperson的删除代码如下:
procedure Tperson.Drop(const person:String);
var
sqlString:String;
上一页 [1] [2] [3] 下一页 没有相关教程
|