首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

多客户端的并发有关问题

2012-02-16 
多客户端的并发问题最近一直在考虑多客户端并发访问数据库的问题,我的想法是多客户端同一时间分别读取互相

多客户端的并发问题
最近一直在考虑多客户端并发访问数据库的问题,我的想法是多客户端同一时间

分别读取互相有交集的数据集并对数据集中的数据进行修改,如果一个客户端修改了

一条记录那么在其他客户端的数据集中相应的这条记录自动刷新到最新的数据。


        我查了一些资料,cursor   type为ctKeyset、ctDynamic的服务器端游标能看到其

他客户端对数据的修改,在游标滚动的时候当前记录会自动刷新到最新的数据。由于

ctDynamic不支持bookmarks,我要用dbgrid做前端显示所以采用了ctKeyset。但是我

发现用dbEdit这类显示单条数据控件的时候滚动游标能够刷新到其他客户端修改的最

新数据但是用dbgrid这种同时显示多条记录的控件在滚动游标的时候数据没有刷新,

哪位仁兄知道这是什么原因?


        另外,关于游标哪位能对比ctdynamic解释一下ctKeyset的底层原理。我发现使

用ctStatic和ctDynamic型游标的时候,如果两个客户端同时读取了一条记录,其中

一个客户端先修改了这条记录,而另一个客户端在没有刷新数据集的情况下尝试修改

这条记录会报错:“无法为更新定位行,一些值可能已在最后一次读取后已更改”,

这样避免了一些不知情的更新数据覆盖。但是,当使用ctKeyset型游标的时候却没有

这种机制,第二个客户端对记录已经发生变化不知情的情况下依然允许修改记录,为

什么会有这样的区别呢?


        哪位有更好的方法欢迎赐教,但是效率一定要高于requery。

[解决办法]
学习!学习!在学习!
[解决办法]
我的做法是不需要知道别人有没有修改,以最后更新的为准
如果是用TClientDataSet自带的appapplyupdata方法,则把服务器的providerflages的pfinKey设为真就可以了
[解决办法]
使用触发器不行吗
[解决办法]
用ClientDataSet配合Socket。每个记录有一个版本号,有个整数全局变量,每发生一次更改让变量加1,并把数字放到记录的版本号字段中。数据更新后,把服务器端版本号写入客户段全局变量中,定期查询高于版本号的更改记录,查到后,将记录更新到ClientDataSet中,并调用MergeChangeLog。
[解决办法]
关注!~遇到过这样的问题,!~
[解决办法]
这是关于记录锁的问题。。。。

我以前在 处理这个问题的时候,就是先简单是否有异常。。如果没有再读取

如果已经被其他的客户端处理,只能弹框给用户,当前记录正在被锁定,请稍候再做修改
[解决办法]
怎么不能用事务处理吗?
[解决办法]
如果你用的SQL SERVER2000就不用考虑这个问题了,数据库本身有这个功能

热点排行