关于事务处理的问题,请看如下代码,急急急!!!在线等待!!!(50分)

  • 主题发起人 主题发起人 dwj_dd
  • 开始时间 开始时间
D

dwj_dd

Unregistered / Unconfirmed
GUEST, unregistred user!
f_data.mast.StartTransaction;
try
query2.ExecSQL;
f_data.mast.Commit;
except
f_data.mast.Rollback;
raise;
end;
执行到 f_data.mast.Rollback;时出现错误如下:“Project p_fccs.exe raised exception class EDBEngineError with message 'No user transaction is currently in progress.ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION.',Process stopped.Use Step or Run to continue.”这是怎么回事?
另外:query.applyupdates 与query.execsql 有什么区别?




 
Query2里的SQL语句是什么?也请提供。。。
程序中的那条raise语句不必要。
ApplyUpdates是提交缓存命令,针对于Query中Select数据集后的插入、修改或删除操作而设,它是当启用了缓存机制时才使用。Query.ExecSql是针对于Query里的Insert、Update、Delete命令的直接执行,与缓存无关。但二者都可以用事务来控制,实现数据同步更新或回滚。
 
query2中的语句是'update pjdinfo set jbh=:jbh,htnum=:htnum,wylb=:wylb where bh=:bh'
应该不会错吧,这和sql语句能有什么关系?
 
如果代码诚如你所贴的话,真的看不出来问题。但是据错误信息看,应该是你没有启动事务(STARTTRANSACTION)却发生了回滚(ROLLBACK)操作所致。
你再仔细检查一下逻辑上有没有漏洞。
 
程序中的那条raise语句根本没用,为什么要放那个/?
如果出错应是回滚才是
 
看看表的触发器和巢状触发的触发器中有没有rollback语句.
 
楼上讲得有道理,检查一下该表有没有触发器,如果有则检查触发器中是否有回滚保护?
一个事务只能一次回滚而无法回滚两次,否则会出现如楼主所描述的错误。这样的错误我以前也犯过。
如果触发器里有回滚语句,建议去掉之,代以Return语句,交由前台控制回滚。
 
如果是ado,那应该是begintrans,但你的代码与下面的代码一样,是标准的写法,
怎么会出错呢?你应该不会在服务器端使用到触发器吧。
procedure TForm1.ApplyButtonClick(Sender: TObject);

begin
with CustomerQuery do
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;

end;
 
谢谢大家!
 

Similar threads

后退
顶部