三層中的事務提交問題(100分)

  • 主题发起人 主题发起人 wlq
  • 开始时间 开始时间
W

wlq

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的系統中﹐同時要更新几個table,我們知道用clientdataset的話﹐它會自動的維
護一個事務﹐但我們發現﹐如果更新中出錯﹐只有該clientdataset所對應的table的提
交取消﹐而別的table被記入﹐所以我在服務器上寫了database.starttransaction,
database.roolback這樣的方法﹐在服務器上調﹐但是會出現一個事務已經存在的錯誤﹐
這可能是用clientdataset.applyupdates時已經啟動了一個事務﹐請問應該如何解決﹐
謝謝
 
不要database的事务处理
 
不用事務﹐我該如何在其中一個clientdataset提交出錯時取消所有的操作?
 
瘦客户有错误处理。
好像现在你又跟我在4月末时候那样在苦思冥想那个database的事务处理哪里去了
 
那時只是理論﹐現在是實際
比如我有3個table要記﹐我記了頭兩個﹐現在在第三個出錯﹐我想取消
以前的所有操作﹐不用事務該怎么辦?
 
>> 只有該clientdataset所對應的table的提交取消
当然是这样的,
我不知道你是如何划分数据更新的方式,能不能改变一下你的更新方式?
 
我發現midas這個自作聰明的事務處理來自provider,因為我不用clientdataset.applyupdates,
而是寫了接口的方法﹐以DeltaDS為參數﹐調provider的applyupdates﹐還是出錯''一個用戶
事務已經在處理中''
我的目的很簡單﹐就是當一系列提交中的某一個失敗﹐就取消以前的所有操作。
 
这种情况很经典,关注!
 
封装到一个存储过程中如何?
 
問了李維﹐他隨便答了一下﹐大意是這是正常的現象
執意要這么做的話﹐可以
* 自己處理delta
* 把TDatasetProvider改掉
按李維的<ADO,MTS...>書的例子改過源碼﹐還是不行,
再想想
 
裝上了第一號補釘包, ok 了
 
》比如我有3個table要記
"记"是什么意思?
另外有什么方法可以"问李维"?
 
怎样可以请教李維?
 
什么补丁包?是Delphi5的那个么?还是又有别的了?
 
sockconnection.appserver.begin
transaction;
success := true;
if client1.applyupdates(-1) > 0 then
success := false;
else
if client2.applyupdates(-1) > 0 then
success := false;
if success then
sockconnection.appserver.commit
else
sockconnection.appserver.rollback;
sockconnection 为midas连接。
在MIDAS服务器端需分别设置三个方法begin
transaciton, rollback, commit, 代码为
database.begin
transaction等。
 
在客户端控制事务不好,它和分布式开发相悖
provider.Appliyupdates时会自动启动一个事务,
所以你的一個用戶事務已經在處理中,事实上,Midas的provider是比较
简单的,不要太依靠它,为了完成真正的分布式开发工作,我实际上
把它override了
 
to addie:我在按你的方法做﹐在提交失敗后﹐SQL中沒東西,在調用了Tclientdataset的
cancelupdate,RevertRecord,UnDoLastChange方法﹐都無法取消我上次的提交﹐即客戶
端記憶體中的資料仍在﹐請問我是否非得自己刪掉它?
toKeVinHe:請問我該如何重載TProvider?請給個例子如何
 
kevinhe说的是一种较为根本的解决方案:重写MIDAS的Provider。我同意,但工作量一定会非常大。
另外,我觉得在客户端控制事务并不与分布式开发格格不入,在某些情况下,还是非常有效的。
WLQ说的情况是不是指提交成功的Client1中的更改资料无法还原,总是已更新成功的状态?
如果是的话,这就是DELPHI的老问题了,即使在传统的C/S开发中,DELPHI也无法还原第一个提交成功的DATASET信息。
比如:
database.begin
transaction
try
dataset1.applyupdates
dataset2.applyupdates
database.commit
except
database.rollback
raise
end;
dataset1.commitupdates
dataset2.commitupdates
上面是C/S开发中常用的一段主子表更新代码(也是delphi帮助中所声明的),执行情况是如果dataset1更新失败,则一切正常,如果dataset1更新成功,而dataset2更新失败,则dataset1无法还原到更新前的状态,除非自己手动更改。这个问题还要请更熟悉的专家解答。
 
以前也碰到过这样的问题,用了个比较笨的方法。
服务器端发布事务的三个方法供客户端调用。
 
后退
顶部