请问高人:为什么delphi的事务不起作用?(200分)

  • 主题发起人 主题发起人 garydudu
  • 开始时间 开始时间
G

garydudu

Unregistered / Unconfirmed
GUEST, unregistred user!
本人将table1的cachedupdate设为true,然后在button的click事件中加入以下代码:
database1.StartTransaction ;
try
table1.Post;
table1.ApplyUpdates;
database1.Commit;
except
database1.Rollback;
end;
table1.CommitUpdates;
如果我用导航条删除了一条纪录时,我们知道此时已经post过了,但是只是影响了缓存,并没有
影响到数据库,如果我这个时候按下button,由于重新执行post,当然会引发异常,于是
引起事务回滚,按道理说数据库纪录不会被删除,但是实际上被删除了,难道delphi的事务
这样烂?
 
你的这个事务过程中并没有包含删除的那个操作,它只是回复到没有table1.Post;之前的那个
状态!这是你处理事务的方法和地点不对!
 
对,楼上说的没错
 
同意楼上的楼上
 
不同意楼上和楼上的楼上和楼上的楼上的楼上.
我想提问题本人是有2个commandbutton
一个是Delete,
一个就是现在这个.
'由于重新执行post,当然会引发异常' 不知道是否正确.
如果 table1.Post; 执行正确则会执行
table1.ApplyUpdates;
database1.Commit;
建议用Debug看一下table1.Pos
 
rollback和commit所能影响的对数据库的操作都是在starttransaction后的内容。
 
我觉得你在table.post之前应该检查一下表是不是被更新了。
改table.post为
if table.state in [dsinsert,dsedit] then table.post;
其他代码不变,应该可以。
 
我的理解,ApplyUpdates是检测数据是否能写入数据库后决定是否往数据库中写,
CommitUpdates 是尝试提交数据后清空缓存,不管事务成功与否,你都执行了!

database1.StartTransaction ;
try
table1.Post;
table1.ApplyUpdates;
database1.Commit;
except
database1.Rollback;
raise;{程序在此抛出异常,防止执行CommitUpdates}
end;
table1.CommitUpdates;
 
后退
顶部