三層中主從表的提交方式------求最佳方式(集事務性﹐同步性) ( 积分: 100 )

  • 主题发起人 主题发起人 urlabelsoft
  • 开始时间 开始时间
U

urlabelsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
三層中主從表的提交方式------求最佳方式(集事務性﹐同步性)
本來去年寫過一些三層的程序﹐現在拿出來看了一下﹐
感覺而些不足。我以前的從表的提交是沒有問題的﹐只是主從表的提交﹐
我感覺有些問題﹐我以前的方式是﹕
**************************************************
if CDSmaster.State in [dsInsert,dsEdit] then
begin
CDSMaster.Post;
if CDSmaster.ChangeCount>0 then
begin
applyupdata(CDSMaster,Maintable,keyfield);
CDSMaster.MergeChangeLog;
end;
****以上是先提交主表*****
然后在主表的afterpost里寫入﹕
if CDSsub.State in [dsEdit,dsInsert] then
CDSsub.Post;
if CDSsub.ChangeCount > 0 then
begin
applyupdata(CDSsub,subtable,keyfield);
CDSsub.MergeChangeLog;
end;
*******************采用這種方式提交從表**********
當然﹐我在里面的有設置好主從的關聯字﹐以及在中間層提交時﹐
我在單表的提交中設置了事務的啟動。
**************************************************

現在問題﹕
從代碼中可以看出﹐我是POST后﹐還保存在內存中﹐就先真正提交了從表﹐
然后再提交主表。問題如下﹕
1﹐如果從表提交成功﹐再提交主表﹐而此時主表提交失敗﹐那數據表中不是有從表沒有主表數據﹐多了一些垃圾數據﹗
2﹐如果從表提交失敗﹐主表一樣也會提交﹐當然﹐這個我可以控制它。(不算大問題)
求最好的三層的主從提交方式﹐當然﹐我所有的提交﹐不是用clientdataset.applyupdate
我采用的是送clientdataset.data到中層﹐進行處理提交。
 
三層中主從表的提交方式------求最佳方式(集事務性﹐同步性)
本來去年寫過一些三層的程序﹐現在拿出來看了一下﹐
感覺而些不足。我以前的從表的提交是沒有問題的﹐只是主從表的提交﹐
我感覺有些問題﹐我以前的方式是﹕
**************************************************
if CDSmaster.State in [dsInsert,dsEdit] then
begin
CDSMaster.Post;
if CDSmaster.ChangeCount>0 then
begin
applyupdata(CDSMaster,Maintable,keyfield);
CDSMaster.MergeChangeLog;
end;
****以上是先提交主表*****
然后在主表的afterpost里寫入﹕
if CDSsub.State in [dsEdit,dsInsert] then
CDSsub.Post;
if CDSsub.ChangeCount > 0 then
begin
applyupdata(CDSsub,subtable,keyfield);
CDSsub.MergeChangeLog;
end;
*******************采用這種方式提交從表**********
當然﹐我在里面的有設置好主從的關聯字﹐以及在中間層提交時﹐
我在單表的提交中設置了事務的啟動。
**************************************************

現在問題﹕
從代碼中可以看出﹐我是POST后﹐還保存在內存中﹐就先真正提交了從表﹐
然后再提交主表。問題如下﹕
1﹐如果從表提交成功﹐再提交主表﹐而此時主表提交失敗﹐那數據表中不是有從表沒有主表數據﹐多了一些垃圾數據﹗
2﹐如果從表提交失敗﹐主表一樣也會提交﹐當然﹐這個我可以控制它。(不算大問題)
求最好的三層的主從提交方式﹐當然﹐我所有的提交﹐不是用clientdataset.applyupdate
我采用的是送clientdataset.data到中層﹐進行處理提交。
 
也遇到过一样的问题。不过一直没有处理,因为从来没有提交失败过,加上懒。 :D,迟早要出问题的。
一个思路:
在中间层提取出一个函数,专门处理主从表的更新,让客户端调用。
ApplyUpdates_MasterDetail(MaintTableName,DetailTableName:String;MainDelta,DetailDelta:OleVariant);
在这个函数里使用事务。
 
我给你两个建议,你参考:
第一,作服务器端一个函数,其中的参数包括你所有的主表和从表中的修改过的数据,也就是把主表和从表的delta都作为参数传递过去,然后服务器部分进行事务集中处理,我想你后面的就会了吧.
第二,定义3个服务器端函数: 那就是封装了begin
Trans,CommitTrans,和RollBack的这些DB的事务语句的函数,每次在客户端根据规则调用.当然了,你要处理好并行的一些关系.
 
這些不是沒有想到呀。
問題是現在要處理的是兩個表﹐就是在事務中﹐
你是先提交從表還是提交主表﹐如果你先提交了主表﹐成功了﹐那再提交從表時﹐
失敗了﹐這樣﹐事務roll﹐
但是我是通過將clientdataset.data傳到中間層的﹐然后將這個DATA改成SQL語句﹐
在事務中話﹐我如果是﹕
try
begin
tran
insert into MAINTABLE()...........
insert into SUBTABLE()...........
***********commit tran //寫在這里﹐一樣會提交的。
except
on exceptiondo
begin
rollback tran
exit --------------------在這里直接退出﹐以免在后面commit
end
end;

***********commit tran //寫在這里﹐才是正確的﹗﹗﹗﹗
請問是不是這樣呀﹖﹖﹖﹖
 
对啊,意思差不多的.就是这样,你就按照我说的,一次用一个函数把两个表的数据都传回去,这样才对.
 
不行的呀﹐
用一函數這樣子不行呀﹐
你以前有沒有這樣子做過﹐
或是非常成功的實例呀﹖
 
你告诉我,为什么用一个函数不行呢?难道不能同时回传主表和从表的数据吗?除非你的从表中不是把所有的数据都读过来的.而是每次主表滚动,从表刷新读取的.
 
在中间层就生成一个Master_Detail表,
只传一个数据包到前台
提交时只提交Master表
 
大家所讲好似都用到了李维提到的这种主从方式。
其实我想听一下,大家对此是用的什么样的模式与方法,
另外,我想问一下,如果采用存储过程来实现不知可否?
接收参数:主表,主表SQL,从表,从表SQL
但是这里,从表的SQL就不是一个了,因为它是多个的。
 
我是这么做的.主表.从表,临时从表 我是用三个表来做的.
添加主从表数据时.从表数据没有直接添加.是先放在临时表里面的.
最后用的事备务提交.不管有没成功都清除临时表.
/////////////////////////////////////////////
有一点就是临时表里面多一个ID号.这个号是服务端在客户端连接时随机产生.
的.所以不同的客户端连在临时表里就用这个来区分自己的临时数据.
 
主表成功了,
再添临时表时,失败了,
你怎么处理呀?????????
 
我是这么做的.主表.从表,临时从表 我是用三个表来做的.
为什么还用临时从表????
你不是WEB页的吧
 
那上楼的是用什么方式做的主从表呀????
 
delphi6彻底研究
P515
好像www.delphibox.com
或www.tomore.com有
 
哈哈,终于给我逮到了,一直在找你,还记得我吗?machcat
QQ:71979515
 
machcat:
你以前给我帮助不少呀,
但是问题是后来我跳了一个厂,不可以上MSN与QQ,
只可以上网呀,就同你失去联系了呀。
能不能帮我看看这个主从的提交问题,
 
我很奇怪,我从来没有遇到在这个方面的更新问题,方法很多的,我前面也列过了,怎么还讨论呢?根本就不复杂啊.只要你把米准备好了,怎么做都可以成为米饭啊.真奇怪.
 
是的,
我也想過很多呀,
其實我早就實現了,
我隻是想問一下,大家都是怎麼搞的。
取別人之長補已之短呀!!!
多多交流,多多提高呀!!
 
错,应该是你给我的帮助不少,非常感谢.大半年没见,现在还好吗?是在经商还是打工?
我知道你对程序开发还是割舍不下的.已看到你发布的源码,三层方面你是高手,我没有什么
发言权.这段时间收集了一点东西,要的话说一声.另外一点愚见:你程序中喜欢多处用类和接口去实现,这样做虽然偶合度低,易于拆装和管理,但个人总觉得开销大,会对存取效率有一定影响.我依然认为三层关键是并发的存取效率和负载度.恕我愚拙,见笑方家了.
machcat@126.com
 
后退
顶部