打印本文 打印本文 关闭窗口 关闭窗口
用Delphi模拟组件的两阶段提交
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1793  更新时间:2009/4/23 18:34:53  文章录入:mintao  责任编辑:mintao
  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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口