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

關於Transaction

尚未結案
tanywei
一般會員


發表:2
回覆:3
積分:1
註冊:2003-11-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-24 14:25:49 IP:61.222.xxx.xxx 未訂閱
請教各位大大... 我的程式中有兩個Transaction... 如何在第一個Transaction Commit完成,而第二個Transaction無法Commit,將兩個都一起Rollback呢?? 如下: if (not dbxConn1.InTransaction) then begin vrTran1.GlobalID := 1; vrTran1.IsolationLevel := xilREADCOMMITTED; dbxConn1.StartTransaction(vrTran1); try cds1.ApplyUpdates(-1); dbxConn1.Commit(vrTran1); if (not dbxConn2.InTransaction) then begin vrTran2.GlobalID := 1; vrTran2.IsolationLevel := xilREADCOMMITTED; dbxConn2.StartTransaction(vrTran2); try cds2.ApplyUpdates(-1); dbxConn2.Commit(vrTran2); except on Exception do begin ShowMessage('無資料可儲存'); dbxConn2.Rollback(vrTran2); end; end; end; end; except on Exception do begin ShowMessage('無資料可儲存'); dbxConn1.Rollback(vrTran1); end; end; end;
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-24 18:35:23 IP:218.167.xxx.xxx 未訂閱
為何不先等trans2 Commit 之後才 進行 trans1.Commit 或是將兩個trans 合併在一起Commit 不成功就可以一起Rollback
tanywei
一般會員


發表:2
回覆:3
積分:1
註冊:2003-11-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-30 16:17:24 IP:220.229.xxx.xxx 未訂閱
謝謝chris_shieh大大的回應... 不過因為我來自兩種不同的資料庫,有SQL及Foxpro 因此必需拆成兩個Transaction... 而勢必Commit會有先後順序... 才有此困擾.....
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-30 17:58:35 IP:219.68.xxx.xxx 未訂閱
我想你應該是需要 兩個 Transactions 必須要同時 Commit 不然就都必須要 Rollback 而且因為是不同DB所以無法包在同一個 Transaction內 我想如果你既然已經Commit 了 就當然無法在該 Transaction 進行 Rollback 畢竟 Commit 就是永久的變更 我想的到的變通方式是針對所有變動, 先預先儲其相反操作的SQL 當Commit 之後需要Rollback 再丟一段 相反動作的 SQL 進去
tanywei
一般會員


發表:2
回覆:3
積分:1
註冊:2003-11-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-31 13:07:19 IP:220.229.xxx.xxx 未訂閱
謝謝chris_shieh大大的回應... 只是做反向操作的SQL... 怕是說如果Delphi有問題就停住不往下執行, 將不會執行到反向操作的SQL這部份, 這樣依舊無法捥回失去的資料.... 唉....苦惱丫...
johnny2212
初階會員


發表:34
回覆:65
積分:39
註冊:2003-04-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-01 19:48:44 IP:61.226.xxx.xxx 未訂閱
您這個程式當初我有一些看不懂,而後經過您的解說,我大致已經了解, 您這個問題必須使用交易伺服器,例如銀行間的轉帳,必須使用IBM的交易伺服器, 而Microsoft也有提供類似的功能,那就是MTSServer(Delphi使用MTSDataModule) 由於分散式交易的結構非常複雜,我只能大致介紹一下,在MTS,SetComplete同義於Commit,而SetAbort同義於Rollback, 簡易的規格如下(您也可以自訂規格)MTS1處理Database1, MTS2處理Database2 1 使用者先將傳指令給MTS1,MTS1先自行處理Database1 2 若MTS1處理Database1出現錯誤,則SetAbort,將失敗訊息傳回給使用者, MTS2根本就不用作了 3 若MTS1處理Database1沒有錯誤,MTS1先不要 SetComplete,先要求MTS2處理 Database2 4 若MTS2處理Database2 SetCompelete(順利完成),則回傳成功訊息給MTS1, MTS1則會做SetCompelete,將成功訊息傳給使用者 5 若MTS2處理失敗(SetAbort),傳失敗訊息給MTS1,MTS1不管成功或失敗,都直 接SetAbort,將失敗訊息傳回給使用者 ps: 1 若處理的是大批資料,要求使用者不要等待,必須配合Thread的使用 2 若使用者傳完指令後,會立即離線的話(Application.Terminate), 您就必須配合DCom(RemoteDataModule)的使用,因為MTS是使於 In-Process,一但離線的話,MTS會自動結束,DCom則不會 分散式交易的難度是很高的,若是可以不依賴交易伺服器,而用僅用幾行程式就能完成的話,那麼IBM可能就要關門吃自己了
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-30 13:44:40 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-03-29 21:41:51
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!