打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
编程入门网-vfp中级教程 第十三课 网络版软件初步
您的位置:首页 >> vfp教程 >> vfp中级教程
第十三课 网络版软件初步 
一、原则
网络软件的最重要原则就是不能两个人同时修改一个数据。否则就会造成冲突,不知以谁的修改为准。
二、普通的解决办法
最普通的办法是在要修改数据时将数据表以独占方式打开,所谓“独占”就是使得数据只能自己使用,而别人不能使用,既不能修改,也不能查看。独占打开表的命令是在 use 命令中加 exclusive 子句,比如:
use rsda exclusive
这样就不会出现两个人同时修改一个数据的情况了。
三、共享数据
如果您只是查看数据,而不进行修改,那么您应该以共享方式打开表,否则别人也就没办法查看数据了,如果大家都是查看,不会有任何的冲突发生,即使查看的是同一个数据。
共享方式打开表的命令是 use ... share ,比如:
use rsda share
对于数据库也是一样的处理:
open database ... share
独占打开则是:
open database ... exclusive
四、友好的提示
如果您以独占方式打开了表,别人无论用独占或共享方式打开表都会出错,错误是“不能存取文件”,错误代码是1705;另外如果有人以共享方式打开了表,其它人试图以独占方式再打开,也会出现同样的错误。
如果在程序中出现这样的错误,可能使操作者莫名其秒,如果能给出比较友好的提示就好了,方法是用 on error 语句捕捉错误,一旦捕捉到错误即给出一个友好的提示,比如在需要共享打开数据时:
on error  err=error()
*上面这条就是捕捉错误的陷井,如在下面任何地方出现错误就将错误代码存入err变量,并不显示错误。
use rsda share  &&如果这时出现错误,错误代码就会存入err,并且表不会打开,也不会出现错误提示。
if err=1705  &&如果错误代码是1705
  *给出自己的提示
  messagebox('数据正在被其它人修改,您暂时不能使用,请稍后再试。',16,'注意')
endif
on error  &&取消捕捉错误
或者在需要独占打开数据时:
on error  err=error()
use rsda exclusive  &&以独占方式打开表,如果有人已打开表则会出错,不论是独占还是共享。
if err=1705
  messagebox('数据正在被其它人使用,您暂时不能进行修改,请稍后再试。',16,'注意')
  *因为操作人员可能并不懂什么叫独占,而此时以独占方式打开表,肯定是要修改,故告诉他不能修改。
endif
on error
五、提高网络效率
学了以上的知识,您就可以编一个简单的网络软件了,但是这种软件的网络效率很低,为什么这么说呢?因为一旦有人独占数据,其它人就都不能看了,假如有几十个人要看这个数据,而该数据又被某人独占,可想而知其工作效率的低下。另外一个缺点就是可能始终都有人在以共享方式打开表,您根本没有机会对数据进行修改。
为了解决效率问题,因此引进“锁”的概念,锁的意思就是将数据锁上后,别人不能修改但可以查看,而且在别人查看时也可以对数据进行加锁修改,这样就解决了上面所说的问题。
给整个表加锁的命令为一个函数:
FLOCK([工作区|别名])
即给指定工作区或别名的表加锁,如果省略工作区或别名,则给当前工作区的表加锁。
该函数的返回值为逻辑值,如果返回“真”,代表加锁成功,如果“假”,则不成功。假如加锁不成功,表明有其它人已经锁住了该文件,目前您不能对其进行加锁,也就是不能修改其中的内容,但您可以查看。
讲到加锁就不能不讲一下这个命令:
SET REPROCESS TO 次数 [SECOND] | TO AUTOMATIC
这个命令的意思是设置尝试加锁的次数或时间。如果 set reporcess to 1,那么当执行 flock() 时,如果不成功立即就返回 .f. ,如果设置为5,那么系统会连续尝试锁5次,如果5次都不成功加锁函数才返回 .f. ,如果跟上 SECOND 子句,则会连续加锁5秒钟。
隐含设置为 set reporcess to 0,系统将会无限次加锁,至到成功为止,并返回 .t. ,期间可按 ESC 键中止尝试,则返回 .f. ,set reporcess to automatic 也是同样的意思。
如果设置 set reporcess to -1 ,那么不但是无限次加锁尝试,而且不能按 ESC 中止,这一般都是不会用到的。
在程序中我们一般只需要试1次就行了,故一般在程序开头设置 set reporcess to 1。
一个典型的加锁程序如下:
select rsda
jscg=flock()
if jscg
  *进入数据的修改处理
else
  messagebox('其它人正在修改数据,您不能修改,请稍后再试。',16,'注意')
endif
数据修改完后应尽快将锁解除,以便他人能够进行数据修改,解锁的命令为:
UNLOCK
注意
 那么是不是说有了锁,独占打开表的方式就没有用了?不是的,有些操作必须要独占整个表,比如这些命令:INSERT, INSERT BLANK, MODIFY STRUCTURE, PACK, REINDEX, and ZAP 。因为它们会使表中的所有记录发生改变或者使表的结构发生改变,那么此时其它人是不能查看数据的。当您的表不是以独占方式打开,系统将会拒绝执行这些命令。
六、进一步提高效率
如果为了改一条记录,而去锁住整个表,这样的效率也不怎么样。为此有了记录锁 rlock() ,该函数的格式为:
RLOCK([工作区|别名]
| [记录号列表, 工作区|别名])
比如:
rlock('1,3,5','rsda')
可将记录号为1、3、5的记录锁住。如果省略记录号则锁住指定工作区(或别名)的当前记录,如省略工作区(或别名),则锁定当前工作区的当前记录。如使用了记录号列表,必须有工作区(或别名),如只指定一个记录(不是列表),可没有工作区(或别名),且用数值指定,比如:
rlock(5)
注意
 如果要锁住多条记录,必须设置 set multilock on,如果是 set multilock off,则只有最后一条加锁的记录被锁住。
有了这个函数就可以锁住一条或多条记录,这样就不至于为了改一条记录,而使得其它所有记录都不能被别人修改。在许多网络软件中,都有多人同时向一个表里输入数据的情况,这就要求软件一定不能经常出现由一个人将整个表锁住的情况。
另外有一个函数 lock() ,它与 rlock() 的功能是完全一样的。
 
目录 下一课 上一课
 
本文来自编程入门网:http://www.bianceng.cn/mcc/mcc13/mcc13.htm
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
20.幻读是什么,幻读有什么问题undefined
美团面试:MySQL中有哪些锁?当时我就懵逼了!
数据库锁表及阻塞的原因和解决办法
mysql的锁机制详解
MySQL锁,锁的到底是什么?
乐观锁和悲观锁详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服