三层多表更新问题,救命呀,送上200大洋!!(200分)

  • 主题发起人 主题发起人 hscys
  • 开始时间 开始时间
H

hscys

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做三层的销售单据时,碰到更新多表问题
前台用Clientdataset的COMMANDTEXT多个SQL语句更新多个表,要求多表更新同时成功,
否则回滚。
如:(希望在往“销售单据表”插入数据时,“库存表中的数量同时改变”
Clientdataset1.close;
Clientdataset1.commandtext:='insert into 销售单据表......';
Clientdataset1.execute;
Clientdataset2.close;
Clientdataset2.commandtext:='update 库存表......';
Clientdataset2.execute;
问题是Clientdataset1在执行execute时,数据已经提交到数据库,而且不能回滚了,
如果在执行Clientdataset1.execute;时断电了或者网络等其他因数,就有可能造成,
销售单据已经开出去,但是相应的库存量没有减少。希望这两步要嘛都成功,要嘛都回滚
该怎么做??
我用的是DELPHI5+ORACLE8I,应用层用QUERY,DATABASE,DATASETPROVIDER,
客户端用DCOM连接,用Clientdataset,请大虾帮忙
 
做个事务,同时控制,等两个事件都完成,再COMMIT
 
在应用服务器写事务处理;实际更新要通过应用服务器上的TQuery处理;
 
事务处理,很多这样的问题了,
 
帅哥,能讲明白一点吗?两层中可以这样写我是知道的
with CustomerQuerydo
begin
Database1.StartTransaction;
try
ApplyUpdates;
{try to write the updates to the database};
Database1.Commit;
{on success, commit the changes};
except
Database1.Rollback;
{on failure, undo the changes};
raise;
{raise the exception to prevent a call to CommitUpdates!}
end;
CommitUpdates;
{on success, clear the cache}
end;
三层怎么做呢?他一执行Clientdataset1.execute就提交到数据库了,没办法回滚,
能告诉我在三层怎么写这个事物??
 
在中间层实现事务处理,既然是做的三层结构,怎么思维方式还是两层的
Server端提供一个方法不就行了?
 
帅哥,能具体点否?我也尝试在SERVER端写方法,但不知道怎么写,即使写了方法,你怎么
把我的Clientdataset.commandtext的参数传到中间层,是在Clientdataset.execute之前调
用SERVER的方法吗?如果不是的话,那等Clientdataset.execute执行完就没法回滚了。
能给个简单的思路吗。李维的书我看了,没有具体讲这个的
 
怎么向中间层传参数?
 
不用COMMANDTEXT来传嘛,直接在方法的参数中传递不就行了?
 
在客户端传SQL语句给中间层,让中间层自己去处理查询语句,当然要先设定事务,
跟两层的一样的啦……
 
同意lujr,不传递SQL而传递参数,SQL应在中间层写。
 
应用服务器有三个航速
第一个为a:adoconnection.transla...()wang le
第er个为b:adoconnection.commit
第san个为c:adoconnection.rollback
ke hu duan wei
clientdataset1.appserver.a;
try
..........
clientdataset1.appserver.b;
except
clientdataset1.c;
 
用MTS事物处理
 
既然你用DCOM,而且ORACLE又是支持两阶段提交的,还有什么比将交易控制交给DCOM来处理更划算的呢?
虽然你用三曾开发,但你还没有真正理解三曾的概念,翻出李维的书仔细研读一小时吧。
 
我觉得很多人作多层应用,都走入的误区!
很多人的应用服务器就只是把原来C/S结构的客户端移到了应用服务器
并没体现多层的优点,我觉得多层的设计一定要遵循OOA/OOD,
要实现企业对象的重用,独立性,商业规则的明确
想hscys的这段代码,我觉得应该在应用服务器建立销售单对象,库存对象
他们分别是COM对象,作为销售单对象,根据销售单的商业要求,定义方法,
这样每个对象都非常明确,易用,建立好各个企业对象后,并不是把每个
对象的方法都公布给客户端,很多商业逻辑要调用很多对象的方法,
这是就要建立large 企业对象,他负责是复杂商业逻辑的实现,以及向
客户端公布接口!
这是我的一点多层构建的观念,不知认识对吗,欢迎大家指正!
最近在研究从uml到delphi实现
 
你的问题不如写个过程在服务器运行更好!
===
我这里用三层也是搬两层的模式,其实我们公司这里用三层主要是为了减轻Database
Server的负担,我们这里clent用户多达200多人,使用的系统近十套,如果用两层
哪台PIII733+LINUX+Oracle817早就死了,现在用了三层,很多工作被分担了
所以我们这里的三层,不是真正意义上的三层!
雨人所说的正是我们的目标,不过并未一朝一夕可以达到的 
 
这么说, 当前三层结构还不是很理想的
 
最直接也是最有效的方法
将代码直接添加到销售单表的datasetprovider的onupdata事件里面
这里本身就是一个事务。
 
说句不好听的,大富翁的风气是越来越坏了,垃圾帖子越来越多!
TO hscys:请问你是用MTS吗,如果你是用MTS的话非常容易
在应用服务器的对象中(对象设置为需要事务)需要写一个接口方法:
try
adoquery1.SQL.Text:='INSERT INTO .....';
adoQuery1.SQL.Text:='UPDATE .....';
adoquery1.Execute;
adoQuery2.Execute;
SetComplete;
except
SetAbort;
end;
如果不是MTS中,写一个接口方法
用TDataBase或 adoconnection来控制实物的提交
adoconnection.StartTransaction
插入;
更新;
adoconnection.CommitTransaction;
在客户端调用接口方法即可
 
后退
顶部