亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

用Delphi模擬組件的兩階段提交

2019-11-18 18:25:49
字體:
來源:轉載
供稿:網友
問題提出:寫了一個數據庫操作的類TDBOperate_DL,統一對數據庫的操作嘛。提供了聲明事務開始、提交事務和回滾事務的方法供其他類調用。
TDBOperate_DL = class
  PRivate
    ADOC:TADOConnection;
    ADOQ:TADOQuery;
    isDestroyADOC:Boolean;    //是否銷毀自己的ADOC?
    fIsInTrans:Boolean;        //是否已經開始事務
  public
    isCommit:Boolean;         //是否要提交事務,缺省是真,如果有類投票說反對提交,就為假
    function IsInTrans:Boolean;
    constructor Create(const newADOC:TADOConnection);overload;
    constructor Create(const ServerName,DataBaseName,UserID,PassWord:String);overload;
    destructor Destroy;override;
    procedure BeginTrans;
    procedure CommitTrans;
    procedure RollbackTrans;
    procedure Execute(const sqlString:String);
    function GetDataset(const sqlString:String):_Recordset;
    function GetConnection:TADOConnection;
    procedure SetConnection(const newADOC:TADOConnection);
  end;
       一些函數的實現:
procedure TDBOperate_DL.BeginTrans;          //開始事務
begin
  self.ADOC.BeginTrans;
  self.fIsInTrans := true;
end;
 
procedure TDBOperate_DL.CommitTrans;              //提交事務
begin
  self.ADOC.CommitTrans;
  self.fIsInTrans := false;
end;
 
procedure TDBOperate_DL.RollbackTrans;              //回滾事務
begin
  self.ADOC.RollbackTrans;
  self.fIsInTrans := false;
end;
 
function TDBOperate_DL.IsInTrans: Boolean;         //查看事務是否已開始
begin
  result := self.fIsInTrans;
end;
 
寫了一個TThing類,用于向數據庫中添加、修改或刪除有關某種東西的記錄,調用TDBOperate_DL類完成。為了調用方便,因此有關的事務就放在了TThing類中,外部調用時不用考慮事務了。
如:
procedure Tthing.Drop(const thing:String);
var
  sqlString:String;
begin
  sqlString := 刪除的SQL語句;
  self.DBOperate.BeginTrans;           // DBOperate是TDBOperate_DL類型的私有變量,創建Tthing類實例時傳入的參數。
  try
    self.DBOperate.Execute(sqlString);
    self.DBOperate.CommitTrans;
  except
    self. DBOperate.RollbackTrans;
    raise;
  end;
end;
后來又寫了個TPerson類,用于向數據庫中添加、修改或刪除有關人的記錄。同樣事務放在了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
      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;
  thing:Tthing;
begin
  sqlString := 刪除的SQL語句;
  thing := Tthing.Create(self. DBOperate,true);              //TDBOperate_DL類型的DBOperate是作為參數傳進去的,true代表需要事務。
  Try
    Try
      Thing.Drop(person);
      Self.DBOperate.Execute(sqlString);
      self.DBOperate.SetComplete;           //投票提交
    except
      self. DBOperate.SetAbort;                       //投票回滾
      raise;
    end;
  finally
    thing.free;                                                           //記著一定要釋放
  end;
end;
記著保持程序中使用唯一的操作數據庫類TDBOperate_DL的實例,記著釋放業務類實例,如果是需要事務的,盡量早釋放,OK,搞定。
第一個版本,水平有限,還需要在實際應用中完善,全當拋磚引玉,請有經驗的大俠們拍磚吧:)

上一篇:古都Delphi

下一篇:delphi的面向對象之路1

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人中文字幕+乱码+中文字幕| 亚洲三级av在线| 国产精品一区二区av影院萌芽| 亚洲成人av在线播放| 丝袜情趣国产精品| 中文字幕亚洲一区二区三区| 人九九综合九九宗合| 欧洲成人免费视频| 91免费看片在线| 国产精品一区久久久| 5566日本婷婷色中文字幕97| 久久久久久亚洲精品中文字幕| 国产精品自产拍高潮在线观看| 国产成人精品一区二区三区| 日韩在线观看免费全集电视剧网站| 中文字幕亚洲欧美在线| 亚洲乱码国产乱码精品精| 欧美多人乱p欧美4p久久| 国产精品9999| 亚洲成人性视频| 欧洲永久精品大片ww免费漫画| 亚洲福利视频久久| 亚洲福利小视频| 色综合久久精品亚洲国产| 久久视频精品在线| 日本国产一区二区三区| 91久久精品国产91久久性色| 欧美高清在线视频观看不卡| 成人动漫网站在线观看| 欧美精品在线观看| 中文字幕免费精品一区高清| 亚洲精品国产综合区久久久久久久| 激情亚洲一区二区三区四区| 97色在线观看| 在线免费观看羞羞视频一区二区| 精品国产欧美一区二区五十路| 26uuu久久噜噜噜噜| 欧美激情精品久久久久久免费印度| 欧美精品免费在线观看| 欧美交受高潮1| 91社影院在线观看| 狠狠色狠狠色综合日日五| 久久久午夜视频| 国产黑人绿帽在线第一区| 国产精品电影久久久久电影网| 成人97在线观看视频| 日本精品一区二区三区在线播放视频| 丰满岳妇乱一区二区三区| 中文字幕亚洲欧美| 亚洲电影中文字幕| 国产一区二区日韩精品欧美精品| 久久在精品线影院精品国产| 91色精品视频在线| 亚洲成人精品久久久| 97久久精品人搡人人玩| 亚洲片国产一区一级在线观看| 欧美激情久久久久| 精品久久久久久国产| 国产欧美中文字幕| 亚洲伊人一本大道中文字幕| 欧美多人爱爱视频网站| 中文字幕一区日韩电影| 亚洲成人999| 大量国产精品视频| 日本精品在线视频| 这里只有精品在线观看| 久久天天躁狠狠躁老女人| 中文字幕亚洲天堂| 亚洲国产精品美女| 96精品久久久久中文字幕| 国产一区二区三区在线免费观看| 欧美小视频在线观看| 精品在线小视频| 欧美亚洲视频在线观看| 97精品一区二区三区| 日韩一区二区三区国产| 国产精品国产三级国产专播精品人| 欧美久久精品一级黑人c片| 欧美精品videos性欧美| 亚洲人成77777在线观看网| 亚洲精品综合精品自拍| 国产精品一区二区久久久| 国产日韩欧美成人| 亚洲视频欧洲视频| 亚洲国产精品视频在线观看| yw.139尤物在线精品视频| 国产热re99久久6国产精品| 亚洲精品久久7777777| 亚洲一区亚洲二区亚洲三区| 日韩在线免费高清视频| 性色av一区二区三区| 亚洲欧美中文日韩在线| 欧美麻豆久久久久久中文| 久久亚洲一区二区三区四区五区高| 97在线视频免费观看| 91国产精品电影| 欧美成人午夜免费视在线看片| 韩国国内大量揄拍精品视频| 久久精品国产清自在天天线| 精品伊人久久97| 欧美日韩中文字幕日韩欧美| 欧洲中文字幕国产精品| 亚洲视频在线观看视频| 亚洲精品按摩视频| 欧美伊久线香蕉线新在线| 亚洲国产精品va在线| 亚洲最大中文字幕| 国产91|九色| 成人做爰www免费看视频网站| 亚洲精品久久久久久久久久久久久| 一区二区亚洲精品国产| 庆余年2免费日韩剧观看大牛| 国产免费一区二区三区香蕉精| 亚洲第一页在线| 97精品在线视频| 国产欧美在线视频| 57pao成人永久免费视频| 97碰在线观看| 国产精品嫩草影院一区二区| 亚洲a一级视频| 中文字幕久久久av一区| 亚洲国内精品在线| 国产精品女主播视频| 热99精品里视频精品| 欧美影院久久久| 欧美亚洲国产成人精品| 精品一区二区三区三区| 亚洲自拍中文字幕| 欧美成人午夜免费视在线看片| 中文字幕一区日韩电影| 久久躁狠狠躁夜夜爽| 亚洲变态欧美另类捆绑| 亚洲欧美日韩在线高清直播| 欧美日韩免费观看中文| 亚洲另类欧美自拍| 亚洲精选中文字幕| 国内精品视频在线| 欧美一级高清免费播放| 成人av电影天堂| 欧美精品一区在线播放| 亚洲精品videossex少妇| 亚州av一区二区| 一区二区三区高清国产| 一道本无吗dⅴd在线播放一区| 亚洲成人精品视频| 97视频免费观看| 久久精品久久久久久国产 免费| 亚洲综合中文字幕在线观看| 欧美自拍视频在线| 国产成人综合一区二区三区| 亚洲天堂男人天堂女人天堂| 亚洲国产精品99| 国产又爽又黄的激情精品视频| 亚洲国产欧美精品| 97久久精品人人澡人人爽缅北| 久久99国产综合精品女同| 92国产精品久久久久首页| 欧美成人中文字幕在线| 亚洲人线精品午夜| 亚洲欧美国产日韩天堂区| 欧美精品精品精品精品免费| 欧美亚洲日本网站| 日韩精品极品在线观看播放免费视频| 亚洲www在线观看|