一个简单但比较恼人的问题,多用户的数据更新! (200分)

D

doxpix

Unregistered / Unconfirmed
GUEST, unregistred user!
一个C/S系统,多个用户对同一个表操作,如何及时地更新各个用户的数据界面显示?
比方A用户增加一条记录,要求B用户能从DbGrid里马上看到;B用户删除一条记录后要
求A用户的DbGrid不再有这条记录.
我们知道数据库的表更新了,但跟DbGrid相连的TQuery并没有更新啊!
难道需要TQuery不停地Requery?
 
用发消息通知的方式
A->服务器->所有可以接受该消息的B
 
没有很爽的解决方案,下面的帖子可以参考
http://www.delphibbs.com/delphibbs/dispq.asp?lid=645268
 
我原来做法是这样的。
1。客户端事务控制,如果有冲突,最好子定义错误,
2。数据库里面最好要锁表,
 
没有实用的解决方案。
必须牺牲速度。
 
用发消息通知的方式可行,在服务器端的数据库被修改时向所有客户发很短的文字信息,客户端收到消息后再向服务器更新。[:D][^]
 
客户较少可以搞一搞,太多了就吃不消了,说不定还会引发出许多其它问题!
 
我在客户端设置时钟,ClientDataSet定时刷新。
 
定时刷新不好,不能及时反应.
我是这样做的:用ServerSocket和ClientSocket建立连接,当客户端起用在服务端留下机器名
当客户端数据更新时,给服务器一个信号,服务器收到信号后根据机器名给每台客户端一个信号
来达到同步更新.
 
我做的那个系统服务器和客户端之间没有采用socket通信机制。所以只好这样了。
 
当B对一条不存在的记录操作时。数据库会产生一个错误,
捕捉这个错误就行了
 
设置CursorLocation=clUseServer,CurtorType:=ctDynamic可用满足我的要求.
但对服务器要求比较高!
 
设置CursorLocation=clUseServer,CurtorType:=ctDynamic后不用使用dgbrid来显示
数据,报错为"Dataset does not support bookmarks, which are required for multi-record data controls",
因为在这种情况下服务器只提供前向游标(ctOpenForwardOnly).
 
要及时刷新
或有变化发消息通知更新。
 
能不能有更好的方法!
 
只能牺牲速度,连本论坛都一样
 
关注。。。

我觉得应该没有一种好的统一的固定方法,因为数据库和客户端的数据同步并不需要应用在
每一个客户端,我较同意 flycity 的说法,针对具体应用具体处理,对实时性要求较高的
客户进行单独处理!!处理方法很多;具体应用还是要从业务上考虑。
 
顶部