网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
用Delphi模拟组件的两阶段提交
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式
在了TPerson类中,现在我想删除人的记录时顺便调用TThing类删除和人有关的东西,事务问题就出现啦:事务不能嵌套啊。如果先删除TThing,再重新声明事务删除TPerson,如果TPerson出错,还怎么回滚TThing?

如:

procedure Tperson.Drop(const person:String);

var

  sqlString:String;

  thing:Tthing;

begin

  sqlString := 删除的SQL语句;

  thing := Tthing.Create(self.DBOperate);              //TDBOperate_DL类型的DBOperate是作为参数传进去的。

  Self.DBOperate.BeginTrans;

  Try

    Thing.Drop(person);               //里面有事务见上面的代码

    Self.DBOperate.Execute(sqlString);

    self.DBOperate.CommitTrans;

  except

    self.DBOperate.RollbackTrans;

    raise;

  end;

end;

解决方法,两阶段提交,先粘点背景知识:

不论两层或三层体系,事物处理都是通过两阶段提交实现的。在第一阶段,每个执行的的资源\记录被写入 事物环境(Transcation Context)中,然后资源协调者顺序查询每一个参与事物的执行是否成功,如果都没有问题的话,就进入第二阶段,每个执行都开始Commit它的操作。如果有一个执行有问题的话,资源协调者通知所有下属的执行放弃Commit,恢复数据原状态。

参考COM+的事务运行,如果一个组件是需要事务的,那么在组件创建时,事务就已经开始了,在组件销毁时进行事务投票,如果是根事务,则进行提交或回滚事务。(如果组件支持池化,这两种情况发生在组件激活和休眠事件中)。于是我们定义一个类如下。

//业务类的祖先类,用于提供统一的事务支持

  TTS_DL = class

  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

   &
  • 下一篇资讯: DELPHI8操作符重载的例子
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号