全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1064
推到 Plurk!
推到 Facebook!

BDPTransaction 的疑問...

尚未結案
chrischi
初階會員


發表:58
回覆:59
積分:28
註冊:2004-05-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-27 14:46:20 IP:61.218.xxx.xxx 未訂閱
請教大家一個問題, 程式碼片斷如下 :      ATransaction := BDPConnection1.BeginTransaction; <- A.啟動交易
  ACommand := BDPConnection1.CreateCommand;
  ACommand.Transaction := ATransaction;
  try      
    ...
    ... <- B.網路斷線了...
    ...
    ATransaction.Commit;
  except
    on Ex : Exception do
    begin
      ATransaction.Rollback; <- C.因網路斷線所以 Rollback 也發生錯誤
      raise Exception.Create('執行有誤.'#13#10   Ex.Message);
    end;
  end;      第一次執行程式碼時, 正確啟動交易後於 B 點發生網路斷線, 於是執行 C 點
  的 ATransaction.Rollback, 但因為網路斷線所以連 ATransaction.Rollback 也
  發生錯誤. 當再一次執行程式碼要啟動交易時, 因為上一交易發生網路斷線而無法
  正確 Rollback 所以也無法啟動另一交易, 請問有無方案可避免上述情況 ?      *假設 : 網路一定有可能於 B 點發生網路斷線(或其他狀況導致無法正確呼叫 Commit/Rollback), IsolationLevel 一定為 ReadCommitted.    謝謝     
發表人 - chrischi 於 2005/01/27 14:53:01
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-27 17:00:43 IP:203.204.xxx.xxx 未訂閱
依我的經驗是:若容易斷或不穩定者,請不要將交易行為寫在cilent 端 而是寫在server ,用sql[預儲程序],經由client 下達一個trigger (觸發) 即可避免這些狀況,而且也比較好處理。 因此,我曾寫過ATM 系統。 DHM
------
ATEIN
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-27 17:02:14 IP:203.204.xxx.xxx 未訂閱
依我的經驗是:若容易斷或不穩定者,請不要將交易行為寫在cilent 端 而是寫在server ,用sql[預儲程序],經由client 下達一個trigger (觸發) 呼叫SQL 交易,即可避免這些狀況,而且也比較好處理。 因為,ATM 系統也是這樣的機制。 DHM
------
ATEIN
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-27 17:13:41 IP:203.204.xxx.xxx 未訂閱
依我的經驗是:若容易斷或不穩定者,請不要將交易行為寫在cilent 端 而是寫在server ,用sql[預儲程序],經由client 下達一個trigger (觸發) 呼叫SQL 交易,即可避免這些狀況,而且也比較好處理。 因為,ATM 系統也是這樣的機制。 另外若不想改變架構,可以:在SERVER 先寫下一服務程序(預儲程序),再定義觸發指訊息,每當假設 : 網路一定有可能於 B 點發生網路斷線(或其他狀況導致無法正確呼叫 Commit/Rollback), IsolationLevel 一定為 ReadCommitted 之時期,就在您的程式產生例外訊息,,再下達呼叫SERVER 內之[預儲程序],觸發初始化先前良好狀況,回復系統。 不然就:在SERVER 內先建立VIEW ,暫不寫入系統主表中,然後以(批次)整批過帳來處理,如此就算一個人當中出錯了(產生例外訊息E.ERROR.ReadOnly),也不會影響其他人的使用權益。 而E.ERROR.ReadOnly 出現時,即下達觸發SQL 預儲程序後,清除該ERROR 的VIEW 或檢查其VIEW ,或每一VIEW 利用時間產生一個唯一序號(UNIQUE)後即代表每一交易為唯一值,若錯誤時,就重新交易;而只是不再使用該筆的資料當繼續交易之條件罷了。 DHM
------
ATEIN
chrischi
初階會員


發表:58
回覆:59
積分:28
註冊:2004-05-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-28 09:28:50 IP:61.218.xxx.xxx 未訂閱
嗯, 基本上 Atein 的建議是不錯, 但我希望的是不涉及其他技術(如資料庫的 Stored procedure 等), 單就 ADO.NET 這樣的資料庫存取架構來解決這樣的 問題, 不然每個作業都如此做法的話會讓系統變個很龐大且複雜難以維護(特 別是 Stored procedure), 因為並不是每個企業都有這樣的專才能接手維護 這麼複雜的系統, 不然在金融機構工作也用不著簽約了, 您說是嗎 ;> 我所指出的就是希望 Delphi 2005 能夠儘快的解決這樣的問題, 因為這種問題 是 "不應該" 出現的, 不然哪一天系統發生了這種情況難道還要讓使用者重新 啟動系統/重新再次輸入資料, 我們寫系統的無非是希望能夠為使用者著想, 而 且如此也失去了修改離線資料(DataSet)再執行實際資料庫資料異動的用意. Chris
ATEIN
高階會員


發表:105
回覆:320
積分:125
註冊:2002-07-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-28 17:09:00 IP:203.204.xxx.xxx 未訂閱
其實: 寫預儲程序有以下好處: 1.提升執行效能,當user Client 一多時,所有的工作全可交由sql-server 處理,因此appliaction server 可以專心的提供介面轉換服務,而sql -server 可單獨運作, ex: client /Application Server //SQl_Server (sql可以有許多部達到分敟平行處理的機制),容易上千人的企業沒問題 2.可以保護程式碼不被copy ,因為 應用介面(只負責介面及安排,不提供商業邏輯)及商業邏輯(預儲程序,不提供介面)全分離開來了。這在專案管理非常重要。 當然還有許多的優點可以談。 也有許專案管理的方法及工具。 DHM
------
ATEIN
系統時間:2024-05-12 20:25:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!