其实就是这么一个过程,在dw update时,他会先检查你所定为key的几列和retrieve时取出的来值是否相同,如果相同则update,不同则报
"row changed between retrieve and update"这个错误
如果出了这个错你会看到在这个错误框里会有个update语句
update 表 set 你所设要更新的列 = :值
where 设定的key = 原来的值;
其实讲了那么多,无非就是这么几种情况:
1、在做报表时设置成:KEY AND MODIFIED COLUMNS && USE UPDATE
2、使用SQL语句: 加上LOCK或 RowLock.
3、记得UPDATE后要COMMIT或ROLLBACK。
4、运用FOCUS或存储过程记得还要CLOSE。
一般来说,要简单的话,记得这样就可以了:
用DataWindow操作的话:
设置DW的Specify Update Characteristics为:
(3)Key and Modified Columns
这样,只要你更新的列的值没有变,则大家都可以成功,有效的防止了多用户重叠更新的问题,相当安全,不必使用第二选项.
如果是使用SQL语句的话,就要使用事务,这样就能确保你的修改是完整而且不被别人干扰的.而且不必使用上面各位朋友的复杂的方法,就这么简单就可以:
假设有数值dec ldec_new = 2000
sqlca.autocommit=false //一定要设置为不自动提交
string ls_err
dec ldec_xxx
select column_xxx into :ldec_xxx from TABLE_yyy where id=keyvalue; //如果有必要查询当前值的话.
if sqlca.sqlcode <0 then
ls_err=sqlca.sqlerrtext //先读错误信息,然后立即ROLLBACK再提示,以免提示时用户不确定,表还在锁定中
rollback; //立即回滚,以免其它用户等待.
messagebox("提示","数据库发生以下错误:~n"+ls_err)
return
end if
update column_xxx=:ldec_new from table_yyy where id=keyvalue; //有必要的话再加 and column_xxx = :ldec_xxx
if sqlca.sqlcode <0 then
ls_err=sqlca.sqlerrtext //先读错误信息,然后立即ROLLBACK再提示,以免提示时用户不确定,表还在锁定中
rollback; //立即回滚,以免其它用户等待.
messagebox("提示","更新数据时发生以下错误:~n"+ls_err)
return
end if
commit using sqlca;
这样就可以了,你在更新时,事务会锁定其它的操作.
最严格的并发控制:
Key and Updateable Columns + Use Update
对主键和所有可更新列进行检查:有任何一个列在提交时发生了变化即告失败,即阻止事物之间修改同一数据。
直接更新方式:阻止事物内部对主键列进行任何交叉修改(逻辑正确也不行)。