讨论:关于Delphi+SQL Server的保存及事务处理(来者有分)(100分)

H

h_q_p

Unregistered / Unconfirmed
GUEST, unregistred user!
有C/S系统中,若有主从表结构时,很多人对处理保存与事务的有各种方式,我的
处理如下:
环境:DataBase1,DataBase2,Table1,Table2,其中Table1为主表,Table2为明细表,通过FormNo关联,并数据库为DataBase1;DataBase2作事务处理。
具体实现是:
1.从表Table2打开缓冲,主表不动;
2.在Table1的BeforePost中激活DataBases2.StartTransaction;
3.在Table1的AfterPost中激活Table2.ApplyUpdate();
4.Table1的OnPostError中执行DataBases2.Rollback;
5.在table2的AfterPost中激活DataBases2.Commit;
4.Table2的OnPostError中执行DataBases2.Rollback;
请问是这样的吗?不知大家有什么看法?
 
我觉得用一个database比较好
 
用异常处理就可以了,用TQuery控件比较好。哈哈。[8D]
 
To xieha:
谢谢关注!用两个TDatabase是希望提高效率。
那对于事务处理的实现有什么看法吗?

对我,我们好应有缘,不信请看看我们的ID...
 
To 阿毛:
能具体点吗?
 
为什么不用Tquery控件呢?控制很容易,特别是对主从表的更新。用两个TDatabase来提高效率?
不解。TDatabase初始化和连接都需要时间,怎么会提高效率呢?用一个Database,直接用
语句 if Master.UpdatesPending or Detail.UpdatesPending then
if Master.UpdateStatus = usInserted then
Database1.ApplyUpdates([Master, Detail])
else
Database1.ApplyUpdates([Detail, Master]);
 
关注!
其实,关于数据库的这类使用,有什么好的资料介绍吗?
 
同意forgot2002的意见
 
到现在为止,我没有找到较全面的资料.谢谢各位关注!!
 
To forgot2002/samcrm:
那事务是在什么时候用.是如下?:
DataBases1.StartTransaction;
try
...
if Master.UpdateStatus = usInserted then
Database1.ApplyUpdates([Master, Detail])
else
Database1.ApplyUpdates([Detail, Master]);
databases1.Commit;
...
except
...
DataBase1.Rollback;
...
end;
 
to h_q_p:

推荐用ADOConnection1配ADODataSet,在主表的ADODaraSet的BeforePost中开启事务管理:ADOConnection1.BeginTrans;
AfterPost中关闭事务管理:ADOConnection1.CommitTrans;
PostError中回滚事务:ADOConnection1.RoolbackTrans;
Action:=daAbort;
 
To Samsrm:
那你对从表更新放在何处?若主表更新成功,从表更新失败呢?
 
建议不要将事务处理代码分布在事件中,那样降低了可读性,增加了维护、查错工作量。
建议用如下结构处理:
代码:
Database.StartTransaction
try
  Table.ApplyUpdate;
  ...
  Database.Commit;
except
  Database.Rollback;
  raise;
end;

qiuliang
qiuliang@163.com
http://qiuliang.mycool.net
 
h_q_p:
在从表的ADODaraSet的BeforePost、AfterPost、PostError中也加入事务管理。
这样保证主表、从表都能获得完整的记录。
 
谢谢各位先!
To Samcrm:
您是将主从表事务分开?甚至是将更新代码也分开?这样做会不会增加系统开销
呢?而且主从表往是在一起录入的,若有主表保存成功,而从表失败(或反之),这样就会
导致保存资料不全面.而我的观点是:要么全部保存,要么全部不保存.以保证资料一致
性.也就是主张主从表用同一事务处理.不知你是怎样考虑的?
 
同意Samcrm的意见![:)]
 
to h_q_p:
由于主表、从表的数据源都是由同一个ADOConnection1提供,不管主表更新失败
还是从表更新失败都将导致ADOConnection1的回滚,因此可以保证资料一致。
 
同意samcrm,
 
接受答案了.再次感谢大家参与!!
 

Similar threads

S
回复
0
查看
660
SUNSTONE的Delphi笔记
S
S
回复
0
查看
651
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部