BDPTransaction 的疑問... |
尚未結案
|
chrischi
初階會員 發表:58 回覆:59 積分:28 註冊:2004-05-04 發送簡訊給我 |
請教大家一個問題, 程式碼片斷如下 : 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 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
依我的經驗是:若容易斷或不穩定者,請不要將交易行為寫在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 發送簡訊給我 |
嗯, 基本上 Atein 的建議是不錯, 但我希望的是不涉及其他技術(如資料庫的
Stored procedure 等), 單就 ADO.NET 這樣的資料庫存取架構來解決這樣的
問題, 不然每個作業都如此做法的話會讓系統變個很龐大且複雜難以維護(特
別是 Stored procedure), 因為並不是每個企業都有這樣的專才能接手維護
這麼複雜的系統, 不然在金融機構工作也用不著簽約了, 您說是嗎 ;> 我所指出的就是希望 Delphi 2005 能夠儘快的解決這樣的問題, 因為這種問題
是 "不應該" 出現的, 不然哪一天系統發生了這種情況難道還要讓使用者重新
啟動系統/重新再次輸入資料, 我們寫系統的無非是希望能夠為使用者著想, 而
且如此也失去了修改離線資料(DataSet)再執行實際資料庫資料異動的用意. Chris
|
ATEIN
高階會員 發表:105 回覆:320 積分:125 註冊:2002-07-05 發送簡訊給我 |
其實:
寫預儲程序有以下好處:
1.提升執行效能,當user Client 一多時,所有的工作全可交由sql-server
處理,因此appliaction server 可以專心的提供介面轉換服務,而sql -server 可單獨運作,
ex: client /Application Server //SQl_Server (sql可以有許多部達到分敟平行處理的機制),容易上千人的企業沒問題
2.可以保護程式碼不被copy ,因為 應用介面(只負責介面及安排,不提供商業邏輯)及商業邏輯(預儲程序,不提供介面)全分離開來了。這在專案管理非常重要。 當然還有許多的優點可以談。
也有許專案管理的方法及工具。 DHM
------
ATEIN |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |