简单的说一下原理:(通常会有两种情况)
第一种:
例如表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修改,并提交成功,则这个数据集就没法提交了. |