關於Transaction |
尚未結案
|
tanywei
一般會員 發表:2 回覆:3 積分:1 註冊:2003-11-04 發送簡訊給我 |
請教各位大大...
我的程式中有兩個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 發送簡訊給我 |
|
tanywei
一般會員 發表:2 回覆:3 積分:1 註冊:2003-11-04 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
|
tanywei
一般會員 發表:2 回覆:3 積分:1 註冊:2003-11-04 發送簡訊給我 |
|
johnny2212
初階會員 發表:34 回覆:65 積分:39 註冊:2003-04-09 發送簡訊給我 |
您這個程式當初我有一些看不懂,而後經過您的解說,我大致已經了解,
您這個問題必須使用交易伺服器,例如銀行間的轉帳,必須使用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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |