visual foxpro6.0及其程序设计 郭盈发 第14章

上传人:E**** 文档编号:89361773 上传时间:2019-05-24 格式:PPT 页数:87 大小:162KB
返回 下载 相关 举报
visual  foxpro6.0及其程序设计 郭盈发 第14章_第1页
第1页 / 共87页
visual  foxpro6.0及其程序设计 郭盈发 第14章_第2页
第2页 / 共87页
visual  foxpro6.0及其程序设计 郭盈发 第14章_第3页
第3页 / 共87页
visual  foxpro6.0及其程序设计 郭盈发 第14章_第4页
第4页 / 共87页
visual  foxpro6.0及其程序设计 郭盈发 第14章_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《visual foxpro6.0及其程序设计 郭盈发 第14章》由会员分享,可在线阅读,更多相关《visual foxpro6.0及其程序设计 郭盈发 第14章(87页珍藏版)》请在金锄头文库上搜索。

1、14.1 多用户简介 14.2 VFP的加锁 14.3 使用数据缓冲技术 14.4 使用事务更新数据,第十四章 多用户共享数据,返回主目录,第十四章 多用户共享数据,14.1 多 用 户 简 介 14.1.1 数据的一致性和正确性 假定,分处于两个网络工作站上的用户甲和用户乙同时使用某表文件A。用户甲打开A表后,对其中的数据进行修改;用户乙打开A表后,只是读其中的数据(不进行修改)。在这种情况下,尽管A表中的数据始终是正确的,但是,在用户乙使用的数据中,很可能部分数据是用户甲修改前A表中原有的数据,部分数据是用户甲修改后A表中更新了的数据。这样就造成了用户乙使用的数据是不一致的。当然,有时数据

2、的不一致性并不产生危害,但是,在有些情况下,则必须保证数据的一致性。,再进一步假定,甲、乙用户同时都对同一表文件A进行修改,这样情况更复杂了。当两用户修改结束后,谁也无法确定,表更新的数据中哪些是正确的,哪些是错误的;哪些数据最终是甲修改的,哪些数据最终是乙修改的,哪些数据是甲、乙双方共同修改的。在此种情况下,无法保证数据的正确性。,14.1.2 加锁、共享、冲突、死锁 加锁(Locking)就是对表文件或记录加锁。当用户甲对表文件加锁后,他可以读写表或记录,其它用户(程序)只能读,而不能修改这些数据,这样既保证了数据的一致性和正确性,又能使多个用户同时使用同一个表,即实现了数据的共享。 加锁

3、虽然可以保证数据的一致性和正确性,但带来了两个新问题:冲突和死锁。 冲突(Collision)就是用户甲对表文件加锁,不允许其它用户修改此表文件后,用户乙企图修改此表文件,即发生了冲突。 在多用户环境下,冲突是不可避免的,因此,用户程序中应包含:当冲突发生时,应如何处理的程序段。,一般来说,冲突也是暂时的。当用户甲试图修改一个被其它用户加锁的表文件时,发生了冲突。稍等片刻后,用户甲再次试图修改这一个表文件时,可能冲突已消失,原因在于加锁用户已撤消加锁(即已解锁)。但产生死锁后,若不采取其它手段,则永远也无法解锁。 死锁(Deadly Embrace)一般是在多表操作时发生。用户甲对表A加锁后,

4、准备修改表B的数据;但表B已被用户乙加锁,并且用户乙也准备修改表A的数据,此时即发生了死锁。甲、乙两个用户无论等待多长时间,都无法等到对方解锁。死锁是最严重的冲突,VFP在出错处理中对其进行处理。,14.2 VFP 的 加 锁,在多用户环境中,可以用两种方式访问文件中的数据: (1) 从独占文件中访问。 (2) 从共享文件中访问。 如果一个文件以共享方式打开,则其它用户也能对该表进行访问;如果一个文件以独占方式打开,则其它用户就不能对该表进行任何读写操作。,14.2.1 独占加锁 访问数据最严格的方式是独占访问。VFP中提供了两种独占访问表文件的方法:使用SET EXCLUSIVE命令、使用带

5、EXCLUSIVE/SHARE子句的USE命令。 1使用SET EXCLUSIVE命令 命令格式:SET EXCLUSIVE ON/OFF 当执行SET EXCLUSIVE ON命令后,再执行USE命令打开表文件时,若无特殊声明,表文件都是被独占访问的。但该命令执行以前,以共享方式打开的表仍保持共享特性。 当执行SET EXCLUSIVE OFF命令后,再执行USE命令打开表文件时,若无特殊声明,表文件都是共享文件。但该命令执行前,以独占方式打开的表仍保持独占特性。,上述程序若能执行成功,职工.DBF表文件被独占打开,工资.DBF表文件被共享打开。 SET EXCLUSIVE 的初始默认值为O

6、N。,请看以下程序代码: SET EXCLUSIVE ON SELECT 1 USE 职工 SET EXCLUSIVE OFF SELECT 2 USE 工资,2使用带EXCLUSIVE/SHARE子句的USE命令 (1) 以独占方式打开职工表,输入命令 USE 职工 EXCLUSIVE 若此命令执行成功,职工.DBF表文件就被用户独占,而不管 是否执行过SET EXCLUSIVE OFF命令。 只能对未被任何用户打开的表文件进行独占打开。若一个表文件已被其它用户打开,则用户再对它进行独占方式打开时,系统将拒绝执行,并给出出错提示:“文件正在使用!”。,为保证数据的正确性和一致性,VFP规定了

7、以下命令只能对独占方式打开的表进行 操作:ALTER TABLE、INDEX、INSERTBLANK、MODIFY STRUCTURE、PACK、REINDEX、ZAP。在一个共享表中执行以上命令,VFP将返回出错信息:“文件必须以独占方式打开!”。 (2) 若要以共享方式打开职工表,只需输入命令: USE 职工 SHARE 若此命令执行成功,职工.DBF表文件是共享打开的,而不管是否执行过SET EXCLUSIVE ON命令。,14.2.2 函数加锁 对于已共享打开的表文件,还可利用函数加锁的方法对其加锁。加锁的对象有两种:一种是对整个表文件加锁,另一种是仅对个别记录加锁。 1函数文件加锁

8、函数文件加锁的语法为:FLOCK(区号表达式/别名表达式) 此函数首先对指定工作区中表文件进行测试。若此文件未被其它用户加锁,则加锁之,并返回函数值 .T.;若此文件已被其它用户加锁,或指定表中的某个记录已经被另一个用户锁定,或指定工作区没有打开的表,则本次加锁不成功,返回函数值 .F.。,如果省略可选参数,则FLOCK ( ) 函数对当前选定工作区中已打开的表进行锁定。 在实际中,此函数往往作为条件语句的条件表达式使用,如 IF FLOCK( )。 例1 FLOCK函数的使用。 CLOSE DATABASES OPEN DATABASE 雇员管理 USE 职工 SELECT * FROM 职

9、工 INTO TABLE 新职工 IF FLOCK( ),*初始化* REPLACE ALL 工资 WITH 0.00 REPLACE ALL 部门 WITH “ “ WAIT “初始化完成“ WINDOW NOWAIT ELSE *文件已被其它用户锁定* WAIT WINDOW “文件已被其它用户锁定,请重试!“ NOWAIT,ENDIF SELECT * FROM 新职工 USE ERASE 新职工 2函数记录加锁 函数记录加锁的语法为:RLOCK/LOCK(区号表达式/别名表达式) 上述两个函数是等价的。首先测试指定工作区中打开的表是否已被其它用户加锁,若没有,则再测试它的当前记录是否已

10、被其它用户加锁;若仍然没有,则对此记录加锁,并返回函数值.T.。在其它情况下,本次加锁均告失败,并返回函数值.F.。,一条记录被加锁后,各用户还可对其它记录加锁。但在一个表中,只要有一条记录被其它用户加锁,用户就无法对此表文件加锁。 该函数也往往作为条件使用,如IF LOCK( )。 3函数加锁的特点 与独占加锁不同,若函数加锁成功,则仅仅不允许其它用户修改被加锁的表文件或记录,并不妨碍其它用户使用被加锁的表文件或记录的数据,因此,函数加锁又称为只读加锁、允读加锁。,4多条记录加锁法 函数记录加锁一次只能加锁一条记录。若要加锁多条记录,就显得不方便了。VFP提供了多记录加锁法。 (1) 一次对

11、多条记录加锁可使用SET MULTILOCKS命令,命令格式为 SET MULTILOCKS OFF/ON 当MULTILOCKS为OFF时,LOCK( )、RLOCK( )函数只能对一条记录加锁。当MULTILOCKS为ON时,LOCK( )、RLOCK( )函数可一次给多条记录加锁。MULTILOCKS的初始默认值为OFF。 值得注意的是,MULTILOCKS状态的每一次变化(不管是OFFON,还是ONOFF),都隐含了UNLOCK ALL命令,即对所有工作区中的所有记录解除锁定。,(2) 一次对多条记录进行函数加锁的函数格式为 LOCK/RLOCK(记录号清单,区号表达式/别名表达式)

12、执行这种格式的LOCK( )、RLOCK( )函数之前,MULTILOCKS状态必须为ON。函数中必须指明工作区。 若记录号清单中所有记录均能成功加锁,则本次加锁成功,返回函数值 .T.;若规定的记录中,只要有一条不能加锁,则本次加锁失败(不对任何一条记录加锁),且函数返回值为 .F.。 LOCK( )、RLOCK( )函数不影响已加锁记录的加锁状态。锁定整个表一般比锁定表中部分记录(哪怕是很少几个)要快。,对函数加锁的表文件或记录,应及时进行解锁操作,否则,其它用户无法对加锁文件或记录进行修改操作。 5函数解锁 函数解锁的命令格式:UNLOCK IN区号表达式/别名表达式 / ALL 函数解

13、锁的功能是:对指定工作区中(或所有工作区中)被加锁表文件及加锁记录进行解锁。 本命令不能影响独占打开表文件的独占性。如果关闭表文件或退出VFP,则同时把各种函数解锁了。,6函数加锁后才能执行的命令 在执行不带范围和条件项的REPLACE和READ命令前,必须先对表文件进行记录加锁或文件加锁(若表文件已被该用户独占,也可以),否则系统将拒绝执行,并给出记录没有加锁的提示信息。,14.2.3 自动加锁 为了安全起见,在执行某些命令时,系统将首先对有关记录或文件进行加锁。加锁成功,才执行命令,命令执行完后,自动解锁。 1自动对记录和文件头加锁 APPEND BLANK APPEND BLANK AR

14、RAY APPEND FROM NSERT-SQL,以上命令自动对所加空白记录和表文件头加锁。若加锁成功,当其它用户恰好也要执行这些命令时,则将产生冲突出错,出错信息为:文件正在被其它用户使用。这种加锁并不影响其它用户在文件中定位。 由此可见,最好在执行APPEND BLANK等命令前,先用FLOCK( )函数进行测试加锁工作。 2自动对记录加锁 VFP在执行下列命令时,将自动对被操作的那个记录加锁。 APPEND MEMO RECALL,DELETE RECALL NEXT l DELETE NEXT 1 REPLACE DELETE-SQL REPLACE NEXT 1 EDIT SHOW

15、 GETS GATHER READ 若其它用户首先对此记录成功加锁(包括对文件加锁、独占打开),则上述命令不能执行,返回冲突出错信息:其它用户正在使用该记录。 3自动对文件加锁,有些命令将修改表文件中多个记录,VFP在执行这些命令前首先自动执行对整个表文件的加锁。若加锁成功,则执行命令,否则,不执行命令,返回冲突出错信息:其它用户正在使用该文件。这些命令是: ALTER TABLE APPEND APPEND FROM BROWSE CHANGE,DELETE (操作对象为两个以上记录) INDEX JOIN RECALL (操作对象为两个以上记录) REPLACE (操作对象为两个以上记录)

16、 UPDATE,14.2.4 自动对文件加锁的命令SET LOCK 命令格式:SET LOCK ON/OFF 有些对表文件操作的命令,实际上只是利用表文件中的数据,并不改变数据,这些命令也可称为只读命令。属于这类命令的有: AVERAGE(带范围) DISPLAY(带范围) REPORT CALCULATE INDEX SORT COPY TO JOIN(多个表文件)SUM COPY TO ARRAY LIST TOTAL COUNT LABEL,执行这些命令时,并不需要对表加锁,即网络中其它用户可共享表文件。若你正用这类命令进行操作,比如制报表,而另一用户却在修改你所用的表文件,这时你所制报表上的数据就可能不

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号