三层结构中,两个客户端A,B同时更新数据库的问题?

时间:2022-05-27 09:00:56
这个问题问过很多次了,不过还是要问一下。

结构为三层结构,中间层为ADOConnection, ADOQuery, DataSetProvider。
客户端为DCOMConnection,ClientDataSet。

客户端A,B同时读出数据,A先把数据字段F1的内容由‘XXX’改为'YYY' ,提交。这时数据库中内容已改变为‘YYY’。
B显示仍为‘XXX’,这时B把字段内容改为‘ZZZ’,提交,中间层会报错“...Record not found or changed by another user...”,数据不会得到提交,数据库中的字段仍然是‘YYY’

(修改时均使用数据感知控件修改,提交使用ClientDataSet的ApplyUpdates方法)

我想如何可以将中间层的错误消息捕获后(或者客户端直接捕获也可以)显示在客户端,提示用户数据已被其他用户修改,需刷新后才可以修改?

这里有个限制条件就是:B客户端后来提交的数据一定不能在不知道A已经更改的情况下去更新。

不知道以上想法是否可行,谢谢!

5 个解决方案

#1


一般情况下,为防止这样的问题,数据库设计的时候有个字段记录修改次数或者修改时间,保存前,中间层里从新判断一下数据库里面该记录的值是否和datasetprovider的oldvalue一致,一致就保存,不一致就提示该数据已经被别人更新过,需要刷新

#2


你的意思就是需要在取数据时就更新那个标记字段,保存时再比较,如果不同,就不保存。但是取标记字段数据后,更新标记字段前也有可能另外一个客户端进来取了这个标记,那么还是有问题,只不过几率比较前者小得多而已。

#3


我的做法是不提示别人有没有改变,就算改变了也一样能修改

#4


中间层执行完后,返回执行的结果给 客户端不就可以了么,如果不成功,提示刷新,重新修改

#5


请问hare007(hare)

如何将中间层的结果返回?是返回给所有客户端吗?具体事件和步骤怎样?

是在DatasetProvider 的OnUpdateError事件里写呢,还是在ADOQuery的OnPostError事件里写?

#1


一般情况下,为防止这样的问题,数据库设计的时候有个字段记录修改次数或者修改时间,保存前,中间层里从新判断一下数据库里面该记录的值是否和datasetprovider的oldvalue一致,一致就保存,不一致就提示该数据已经被别人更新过,需要刷新

#2


你的意思就是需要在取数据时就更新那个标记字段,保存时再比较,如果不同,就不保存。但是取标记字段数据后,更新标记字段前也有可能另外一个客户端进来取了这个标记,那么还是有问题,只不过几率比较前者小得多而已。

#3


我的做法是不提示别人有没有改变,就算改变了也一样能修改

#4


中间层执行完后,返回执行的结果给 客户端不就可以了么,如果不成功,提示刷新,重新修改

#5


请问hare007(hare)

如何将中间层的结果返回?是返回给所有客户端吗?具体事件和步骤怎样?

是在DatasetProvider 的OnUpdateError事件里写呢,还是在ADOQuery的OnPostError事件里写?