起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 1251|回复: 3

保存数据时,提示“Record not found or changed by another user”

[复制链接]
发表于 2004-8-18 09:47:32 | 显示全部楼层 |阅读模式
当向数据库服务器提交数据的时候,如果发现这次提交的语句没有作用到任何一条数据记录上,就提示这个错误。比如:修改了一个字段的值,但是提交的时候(其实是发了一条update 语句),没有任何一条记录因为这条SQL语句而得到修改,于是就提示了这个错误。也就是update语句根据where部分的语句定位不到符合条件的记录。通过如下两个步骤解决这个问题:

1、确认没有其他操作者同时修改了这条记录,如果同时有其他的用户修改这条记录,这样的提示就是正常的;

2、修改数据集的更新选项的更新模式,有三个选项:所有字段、主键和修改字段、主键。修改这个更新模式为主键,这样只有主键会出现在where部分。


提示: 并不是所有的这种提示都要这样的修改更新模式,要根据实际的业务需求来定。比如,业务上要求一个操作者修改,其他的人就不可以修改,那么这样的提示就是正常的。
回复

使用道具 举报

发表于 2005-5-23 10:49:59 | 显示全部楼层
简单的说一下原理:(通常会有两种情况)
第一种:
例如表T1的中有3个字段/1条记录:
FGUID   FVALUE1  FVALUE2
1       1        1
用户A和用户B在运行平台中,基本同时把这条记录取下来了.
然后各自对这条记录进行修改和提交
如果用户A把字段FVALUE1的值改为2了,系统提交的SQL语句就是:
Update T1 set fvalue1 = 2 where fguid = 1 and fvalue1 = 1 and fvalue2 = 1
用户A提交成功以后数据就变成:
FGUID   FVALUE1  FVALUE2
1       2        1
但是这时用户B的运行平台它并不知道用户A已经提交成功了呀,用户B继续做着对数据集的修改
如果用户B把字段FVALUE2的值改为11了,系统提交的SQL语句就是:
Update T1 set fvalue2 = 11 where fguid = 1 and fvalue1 = 1 and fvalue2 = 1
这时问题来了,因为FVALUE1的字段值已经被用户A改为2了,所以这个提交语句的Where部分将定位不到任何记录,所以就报那个错.

第二种:用户A的某业务功能中有两个业务数据集,他们都是访问表T1的那条记录,如果这两个业务数据集同时把那条记录取下来进行修改和提交,只要有一个数据集提交成功,把数据改了,另外一个数据集就不能提交了.

其实这两种情况都有一个本质原因就是,在某个数据集修改某些数据的过程中,这些数据被其他数据集/或者SQL修改,并提交成功,则这个数据集就没法提交了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-16 12:04:24 | 显示全部楼层

保存数据时,提示“Record not found or changed by another user”

当想数据库服务器提交数据的时候,如果发现这次提交的语句没有作用到任何一条数据上,就提示这个错误。
比如:修改了一个字段的值,但是提交的时候(其实是发了一条update 语句),发现没有任何一条记录因为这条SQL语句而得到修改,于是就提示了这个错误。

重现这个错误的最基本的原因就是update语句的where部分对条件的限定有问题造成的。

解决方法:
1。确认没有其他用户修改了这条记录。
2。修改数据集的更新选项的更新模式,有三个选项:所有字段、主键和修改字段、主键。修改这个更新模式为主键,这样只有主键会出现在where部分。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-16 12:04:32 | 显示全部楼层
在单用户时,有两种情况也会产生不正常的record not found or changed by another user错误
1、使用自动增长字段,新增记录保存后立即修改记录又保存时
2、日期字段,特别是数据库中产生的日期,主要的毫秒的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-4-27 16:45 , Processed in 0.038737 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表