事务回滚后再次提交失败,错误信息"Row cannot be located for updating. Some values may have been changed since it was last read".

jin2001 2003-10-15 12:43:26
SQLServer2000,表主键为自增长,TADOQuery,在事务中,主表提交成功后,子表提交失败,事务回滚后,再次提交,弹出错误对话框"Row cannot be located for updating. Some values may have been changed since it was last read".如何解决。谢谢。
...全文
53 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiyf 2003-11-02
  • 打赏
  • 举报
回复
UpdateBatch会判断adoquery的状态(是更新、插入、还是不变),如果没有变化,就不生成sql语句,不发给服务器。
xiyf 2003-11-02
  • 打赏
  • 举报
回复
服务器是回滚了,只是adoquery的状态没有回滚,第二次提交时,就认为adoquery没有改变,就不再向服务器发sql语句了

现在的解决方案:
1、先做删除操作,然后再插入一次呀。而且是自己写sql就可以了
idilent 2003-10-29
  • 打赏
  • 举报
回复
第一次事务失败后,服务器段接收到什么?有没有滚会呢?
xiyf 2003-10-26
  • 打赏
  • 举报
回复
我发现这样一个问题:
1、第一次提交主表成功后,提供明细失败,抛出异常。
2、第二次再提供主表,如果主表更改动,发现的是UPDATE语句;如果没有主表没有改动,第二次主表没有发出任何语句。从表也存在同样问题。
xiyf 2003-10-26
  • 打赏
  • 举报
回复
我也碰到这个问题,你后来怎么解决的?
xiyf 2003-10-26
  • 打赏
  • 举报
回复
第一次事务开始,服务器端收到了:+SQL:BatchStarting set implicit_transactions on 21:41:45.887
第二次事务开始,服务器没有收到这个的语句呀,为什么呀?
xiyf 2003-10-26
  • 打赏
  • 举报
回复
没有呀,我用服务器带的sql监视器看了,没有呀,在第二次提交时,根本没有向服务器提交sql语句。
idilent 2003-10-26
  • 打赏
  • 举报
回复
没有用过updateBatch,但是delphi的帮助中说
To use batch updating, the CursorType property of the dataset component must be either ctKeySet (the default) or ctStatic and the LockType property must be ltBatchOptimistic.

还有就是updateBatch是不是虽然放在事务中,但是被调用的话,实际也已经把数据更新到数据库中了?
你可以在项目中测试以下,就是单步执行,等updatebatch执行完毕后,看数据库中的数据是否已经发生了变化。
liufuyahong 2003-10-16
  • 打赏
  • 举报
回复
我以前也遇到过,后来去掉主键的Default属性就行啦。
还有一次是我用触发器将表的数据改变了,也出现了类似的问题,后来是先关闭数据集再
重新打开才解决了问题。

将两个表的结构贴出来看看
jin2001 2003-10-16
  • 打赏
  • 举报
回复
难道不能解决吗?
jin2001 2003-10-16
  • 打赏
  • 举报
回复
跟自动增长没有关系。主表更新成功后,子表提交失败数据库回滚后,数据库中没有主表记录,但是在dataset中依然存在,再此提交dataset与数据库中数据作比较,发现没有该条记录就报错。csdn、delphi版的高手帮帮忙,这个问题大伙应该都能遇见
jin2001 2003-10-16
  • 打赏
  • 举报
回复
事务处理代码如下
try{
// 开始事务
TADOQuery(dsMasterTable.DataSet).Connection.BeginTrans;

// 提交主表
TADOQuery(dsMasterTable.DataSet).UpdateBatch;

// 给子表MainID字段赋给主表子增长子段的值, 提交明细
with TADOQuery(dsDetailTable.DataSet) do
begin
First;
while not eof do
begin
Edit;
FieldByName('MainID').AsInteger :=
TADOQuery(dsMasterTable.DataSet).FieldByName('MainID').AsInteger;
Next;
end;
UpdateBatch;
end;

//提交事务
TADOQuery(dsMasterTable.DataSet).Connection.CommitTrans;
except on e: Exception do
begin
// 回滚
TADOQuery(dsMasterTable.DataSet).Connection.RollbackTrans;
end;
end;
谢谢
liufuyahong 2003-10-16
  • 打赏
  • 举报
回复
default 属性就是在字段的后面加上"default"关键字
Example:Sql server 的Script

create table TableName
(
Field_1 FieldType primary key default 'XXX',
Field_2 .......................,
.
.
.
Field_N
)
idilent 2003-10-16
  • 打赏
  • 举报
回复
事务处理部分的代码贴出来看看
jin2001 2003-10-16
  • 打赏
  • 举报
回复
主键default属性是什么。表结构是Master/Detail。均为自增长。先关闭数据集再
重新打开能解决,但是页面上用户输入了很多信息,刷新后数据全部消失。不是好的解决方法
liufuyahong 2003-10-15
  • 打赏
  • 举报
回复
表主键不能自动增长,也不能有Default等约束!!!
jin2001 2003-10-15
  • 打赏
  • 举报
回复
不行,错误依旧,问题发生在提交语句post.求助
delphi_xizhousheng 2003-10-15
  • 打赏
  • 举报
回复
还有就是TADOQuery的CursorType改成ctDynamic
jin2001 2003-10-15
  • 打赏
  • 举报
回复
各位高手帮一下忙,好吗
delphi_xizhousheng 2003-10-15
  • 打赏
  • 举报
回复
你回滚后就已经退出事务了,所以要提交必须再次开始一个事务
if not ADOConnection1.InTransaction then
ADOConnection1.BeginTrans;

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧