各位高手请指教,ADO事务回滚问题(100分)

  • 主题发起人 主题发起人 老头
  • 开始时间 开始时间

老头

Unregistered / Unconfirmed
GUEST, unregistred user!
执行下面代码后,你认为数据库会增加记录吗?答案是否。

//MDB库,ADOTable1.Connection=ADOCn1; clUseClient, ltBatchOptimistic
begin
ADOTable1.InsertRecord([...]);

ADOCn1.BeginTrans;
ADOTable1.UpdateBatch;
ADOConnection1.RollbackTrans;

ADOCn1.BeginTrans;
ADOTable1.UpdateBatch;
ADOCn1.CommitTrans;
end;

在实际的程序中,我在事务代码中处理三个表,其中一个显示在DBGrid中供用户插入多条记录,我希望在全部成功提交之前插入的记录保持在缓冲中,用户可以继续编辑并重新提交。

问题的实质是:在事务回滚之后,表缓冲状态没有改变,ADO误认为这些记录已经在物理表中存在,所以在实际的程序中还会引发很多其它错误。

我特意学了一下VB并作同样的测试,结果也是如此。我以前用VFP不存在这个问题(当然没有用ADO,只是VFP本身的DBC、DBF)。

我知道有两个间接的答案:
一、用TStringGrid代替TDBGrid保存提交之前的记录,这很麻烦且影响界面的一致性;
二、动态建立临时表(由于该表有一外键且键值在提交前未知),同样也很麻烦(要保证多用户间不冲突)且感觉总是不合理,至少MDB会高速膨胀。如果ADO可以在内存中建立临时表,这样做倒不错。

希望哪位高手能提供直接解决的办法,先多谢了。
 
我又想到一个合理一点的间接方案:事务提交前将记录复制到数组中,在事务更新失败时对该表执行Requery然后重新插入这些记录。

希望有更好的方案。

今天又发现一个问题,我利用原来的一个20M的DBF文件测试ADO的打开速度,结果令人吃惊,客户端数据集大约80秒,服务器端则为20秒左右,原来在Foxpro中是与几百k小文件无分别的。我相信MDB也不会好多少。这个不需要回答,只是得到一个经验,尽量不要直接打开表。哦,有一个小小的问题,如果只想显示刚插入的新纪录,难道只能“Select * from table where FALSE”吗?这不会有没有任何麻烦,只是看起来有点滑稽。
 
我认为你的源码可能有问题,
我这样写:
ADOConnection1.BeginTrans;
Try
ADOTable1.Edit;
{编辑数据};
ADOTable1.Post;
ADOConnection1.CommitTrans;
Except
ADOConnection1.RollbackTrans;
End;
 
xinyt:
我的源码没有问题,注意,我用的是批更新方式。
问题是:在事务回滚之后,表缓冲状态没有"回滚"。
可能这属于正常,只是ADO与VFP对事务回滚与缓冲的定义不同吧。
 
还是我自己作答吧:这大约是个愚蠢的问题,本来就不该问。
我最后的解决办法是,写一个类用来备份pending record。在事务更新失败回滚时执行requery然后恢复备份。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部