2. 出错原因
两个用户同时获取了某一条记录,然后分别对这条记录做了修改,这样当用户A提交数据以后,用户B提交的SQL语句的Where子句就无法找到这条记录了。
例如表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 fvalue1 = 11
WHERE fguid = 1
AND fvalue1 = 1
AND fvalue2 = 1这时问题来了,因为FVALUE1的字段值已经被用户A改为2了,所以这个提交语句的Where部分将定位不到任何记录,所以就报那个错.
某业务功能中有两个业务数据集,他们都是访问表T1的那条记录,如果这两个业务数据集同时把那条记录取下来进行修改和提交,只要有一个数据集提交成功,把数据改了,另外一个数据集就不能提交了。原理跟上面一样。
表中使用自动增长字段,当新增记录保存后,表中的自动增长字段已经有值,而数据集中没有值,造成数据集与表中字段的值不一致,这时候再修改字段的值时候,生成的Where子句就无法定位到表中的记录
表中使用了触发器,当数据修改以后,触发器又修改了某个字段的值,造成数据集与表中字段的值不一致,这时候再修改字段的值时候,生成的Where子句就无法定位到表中的记录
Where子句中包括了浮点数、日期时间等类型的有精度损失的字段,这样常常造成Where子句中给定的条件与记录上实际存在的字段值之间不能匹配 |