第 13章 多用户操作
第 13章
13.1 多用户简介
13.2 多用户 FoxPro 的加锁和
出错处理
13.3 死锁的预防
第 13章 多用户操作
13.1 多 用 户 简 介
13.1.1 数据的一致性和正确性
假定,分处于两个网络工作站上的两程序甲和乙同
时使用某库文件 A。 甲打开 A库文件后,对其中的数据
进行修改 ; 乙用户打开 A库文件后,只是使用其中的数据
(即不进行修改操作 )。
第 13章 多用户操作
再进一步假定,甲, 乙两用户同时都对同一库文
件 A进行修改 。 此时,情况更复杂了 。 当两用户修改
结束后,谁也无法确定,库文件更新的数据中,哪些是正
确的,哪些是错误的 ; 哪些数据最终是仅由甲修改的,哪
些数据最终是乙修改的,哪些数据是甲乙双方修改的结
果 。 也即,在这种情况下,连数据的正确性都无法保证 。
加锁可以保证数据的一致性和正确性 。
第 13章 多用户操作
13.1.2 加锁,共享,冲突与死锁
所谓加锁 (Locking) 就 是 对 库 文 件 加 锁 (File
Locking)。 当用户甲对库文件 A加锁后,其他用户都不
能再使用此库文件 。
上述的加锁法虽然可以保证库文件数据的一致性
和正确性,但却不能使多个用户同时使用同一个库文件,
即破坏了共享 。
当用户甲要使用某库文件数据时 (不修改 ),如果不
在乎数据是否一致,他并不需要对库文件 A进行加锁 ; 但
若他要求数据必须一致,那么必须给库文件 A加锁 。
第 13章 多用户操作
加锁虽然可以保证数据的一致性和正确性,但加锁
也带来了两个新问题, 冲突和死锁 。 (Collision)。
当用户甲对库文件加锁,不允许其他用户使用此库
文件后,用户乙企图打开此库文件,就发生了冲突 。 或
者,当用户甲对库文件加锁,不允许其他用户修改此库
文件后,用户乙企图修改此库文件,也会发生冲突 。
死锁一般在多库文件操作时发生 。 用户甲对库文
件 A加锁,不允许其他用户使用,然后,准备使用库文件
B的数据 ; 但库文件 B已被用户乙加锁,不允许其他用户
使用,且用户乙也准备使用库文件 A的数据 。
第 13章 多用户操作
13.2 多用户 FoxPro 的加锁和
出错处理
13.2.1 多用户 FoxPro 的加锁
1.
在打开库文件的同时,对库文件进行的加锁为独占
加锁 。 独占加锁是最严厉的加锁 。 一个库文件被独
占加锁后,只有加锁用户可以使用该库文件,其他用户
无权打开此库文件,更谈不上修改,使用此库文件了 。
(1) 独占加锁法 。
第 13章 多用户操作
FoxPro提供了两种独占加锁的方法 。
① 使用 SET EXCLUSIVE命令,命令格式为,
SET EXCLUSIVE ON/OFF
执行了 SET EXCLUSIVE ON命令后,系统将处于
EXCLUSIVE ON状态 。 在此状态下,执行 USE命令打
开库文件时,若无特殊声明,被打开的库文件都是独占
加锁的 。 但是,该命令执行以前,未独占打开的库文件,
仍保持不独占加锁的特性 (共享特性 )。
第 13章 多用户操作
执行了 SET EXCLUSIVE OFF命令后,系统即处于
EXCLUSIVE OFF状态 。 在此状态下,利用 USE命令打
开库文件时,若无特殊声明,打开的库文件是不独占加
锁的 。 但是,此命令执行前,已独占加锁的库文件,仍
保持独占加锁的特性 。
观察下列程序段,
SET EXCLUSIVE ON
SELECT 1
USE 职工
SET EXCLUSIVE OFF
第 13章 多用户操作
SELECT B
USE 工资
上述程序若能执行成功,职工,DBF库文件独占加锁,
工资,DBF 未独占加锁 (可共享 )。
SET EXCLUSIVE的初始默认值为 ON。
② 打开库文件时,声明独占加锁 。 利用 USE命令
打开库文件时,若带有子句,
EXCLUSIVE
则打开的库文件是独占加锁的 。 即使刚执行过
SET EXCLUSIVE OFF命令,也是如此 。
第 13章 多用户操作
例
USE 职工 EXCLUSIVE
若此命令执行成功,职工,DBF库文件就被该用户独
占 。
③ 打开库文件时,声明可共享 。 利用 USE命令打开
库文件时,若带有子句,
SHARE
则打开的库文件是可共享的 。 即使刚执行过 SET
EXCLUSIVE ON命令,也是如此 。
第 13章 多用户操作
(2) 独占加锁的条件 。
只能对未被任何用户打开的库文件进行独占加锁 。
若一个库文件已被其他用户打开,用户再对它进行独占方
式打开时,系统将拒绝执行,并给出出错提示,
File is in USE by another 其他用户正在使用该文件
(3) 只能在独占方式下执行的命令 。
为保证数据的正确和一致,FoxPro规定一些命令只能
对独占库文件进行操作。
(4) 独占加锁解锁法 。
对于已独占打开的库文件来说,解锁的惟一方法是
关闭此库文件 。 否则,无法改变其独占状态 。
第 13章 多用户操作
2,函数加锁
对于已共享打开的库文件,还可用函数加锁的方法
对其加锁 。 函数加锁的方法有两种, 一种是对整个库
文件的加锁 ; 另一种是仅对个别记录的加锁 。
(1) 函数文件加锁 。
(2) 函数记录加锁 。
(3) 函数加锁的特点 。
(4) 多条记录加锁法 。
(5) 函数加锁的解锁 —— UNLOCK命令 。
(6) 函数加锁后才能执行的命令 。
第 13章 多用户操作
3,自动加锁
为了安全起见,在执行某些命令时,系统将首先对有
关记录或文件进行加锁 。 加锁成功,才执行命令,命令
执行完,自动解锁 。
(1) 自动对记录和文件头加锁 。
APPEND BLANK命令自动对所加空白记录和库文
件头加锁 。
(2) 自动对记录加锁 。
FoxPro在执行下列命令时,将自动对被操作的那个
记录加锁 。
第 13章 多用户操作
(3) 自动对文件加锁 。
有些命令将修改库文件中多个记录,FoxPro在执行
这些命令前首先执行自动对整个库文件的加锁 。
4,用控制键 ^O加锁
若欲对未加锁的库文件执行 CHANGE和 EDIT命令,
则在对记录操作前,必须用控制键 ^O对记录加锁 。 加
锁成功,才能修改该记录 ; 否则,将提示, Unable lock(不
能加锁 ),并且,不允许修改记录 。
。
第 13章 多用户操作
5,自动对文件加锁命令 ——SET LOCK
命令格式, SET LOCK ON/OFF
有些对库文件操作的命令,实际上只是利用库文件
中的数据,并不改变数据,这些命令也可称为只读命令
6,影响加锁执行时间的命令 ——SET REPROCESS
命令格式, SET REPROCESS TO 〈 数字表达式 〉
[ SECONDS] /TO AUTOMATIC
功能, 此命令规定,在一次不成功的加锁后,还继续
尝试多少次或多长时间加锁 。 ON ERROR将会影响此
功能 。
此命令可转化成多种格式,下面分别予以介绍 。
第 13章 多用户操作
(1) SET REPROCESS TO 0
(2) SET REPROCESS TO -1
(3) SET REPROCESS TO〈 数字表达式 〉,且 〈 数
字表达式 〉 值大于 0。
(4) SET REPROCESS TO〈 数字表达式 〉
SECONDS,且 〈 数字表达式 〉 大于 0。
(5) SET REPROCESS TO AUTOMATIC
第 13章 多用户操作
7,即时共享命令 ——SET REFRESH
命令格式, SET REFRESH TO〈 数字表达式 1〉
[,〈 数字表达式 2〉 ]
功能, 确定用户屏幕是否即时跟踪网络上其他用户
对数据的修改 。 网络中,允许共享某库文件 。
若 〈 数字表达式 1〉 为 0,则已打开浏览窗中的内容,
不随其他用户的修改而更新 (0 也是系统初始默认值 )。
若 〈 数字表达式 1〉 大于 0(最大为 3 600),其单位
为秒 (s),则每隔这段时间,浏览窗内容将根据最新内容,
更新一次 。
第 13章 多用户操作
当用户企图更新浏览窗某记录时,系统将自动对该
记录加锁。
SET REFRESH将影响 BROWSE CHANGE,EDIT
命令打开的浏览窗的内容,也将影响浏览窗中打开的修
改记忆型字段的编辑窗内容 。
网络中,用户工作站内存中的库文件,是存放在工
作站缓冲区中的 。 〈 数字表达式 2〉 决定每隔多长时
间 (单位为秒 (s)),缓冲区内容根据最新数据而更新 。
表达式 2〉 可在 0~3 600 之间,系统初始默认值为 5。
当设置为 0 时,不更新缓冲区内容 。
第 13章 多用户操作
13.2.2 多用户 FoxPro 的出错处理
出错处理就是冲突处理 。
从前面的介绍可知,在多用户状态下,发生冲突是很
正常的 。 因此,多用户状态必须具有处理冲突的能力 。
1,出错信息及相应出错号
(1) 出错信息, 其他用户正在使用该文件 。
(2) 出错信息, 其他用户正在使用该记录 。
(3) 出错信息, 需独占打开文件 。
(4) 出错信息, 记录没有加锁 。
(5) 出错信息, 非法的打印路径 (invalid printer
redirection)。
第 13章 多用户操作
2,冲突处理
在多用户状态下,只要库文件有可能被其他用户使用,
冲突就是一种正常现象 。
因此,用户程序中就必须有检测冲突,处理冲突的功能。
(1) 多用户 FoxPro中与冲突处理有关的 3 个函数如下:
① ERROR函数
② MESSAGE函数
③ SYS(16)函数。 SYS是一组函数,SYS(16)是其中之一。
第 13章 多用户操作
(2) 处理冲突命令 ——ON ERROR
命令格式, ON ERROR[ 〈 命令 〉 ]
功能, 规定程序出错后,应作何种处理 。
程序运行过程中,若出现错误,则执行 ON ERROR
指定的命令 。 一般地,是一条 DO命令,来处理错误 。
执行完指定命令后,程序回到出现错误命令的下一
条命令,继续执行 。 但是,处理错误过程中,常包含
RETRY语句,则又重新执行出现错误的那条命令 。
不带选择项的 ONERROR命令将中止前面 ON
ERROR命令的内容。
第 13章 多用户操作
例 如,若用户编制了处理冲突的子程序 ERR.PRG,
则 ON ERROR命令大致有以下两种格式,
ON ERROR DO ERR
ON ERROR DO ERR WITH ERROR( ),MESSAGE( ),
SYS(16)
前一格式命令执行后,只要发生冲突,将转去执行
ERR.PRG子程序 。 后一格式命令执行后,只要发生冲
突,将转去执行 ERR.PRG子程序,并且将出错参数带去 。
第 13章 多用户操作
13.3 死 锁 的 预 防
从两个方面来解决死锁问题, 预防和检测。
1,死锁的预防
虽然有不少人提出了不少预防死锁的方法,但在
FoxPro的应用系统中,最可行的方法只有一个, 对共享
库文件规定一个加锁顺序,并严格要求所有用户遵守此
规定 。
第 13章 多用户操作
2,死锁的检测
在 FoxPro应用系统中,要想准确检测到死锁是极其
困难的 。 一般的策略是, 当发生冲突后,经过有限次的
努力,仍然不能解决冲突,则逐步解锁自己已加锁的资
源 。 但是,这种策略增大了程序的复杂性,因此很少采
用 。 所以,对于 FoxPro应用系统来说,死锁问题以预防
为主 。
第 13章
13.1 多用户简介
13.2 多用户 FoxPro 的加锁和
出错处理
13.3 死锁的预防
第 13章 多用户操作
13.1 多 用 户 简 介
13.1.1 数据的一致性和正确性
假定,分处于两个网络工作站上的两程序甲和乙同
时使用某库文件 A。 甲打开 A库文件后,对其中的数据
进行修改 ; 乙用户打开 A库文件后,只是使用其中的数据
(即不进行修改操作 )。
第 13章 多用户操作
再进一步假定,甲, 乙两用户同时都对同一库文
件 A进行修改 。 此时,情况更复杂了 。 当两用户修改
结束后,谁也无法确定,库文件更新的数据中,哪些是正
确的,哪些是错误的 ; 哪些数据最终是仅由甲修改的,哪
些数据最终是乙修改的,哪些数据是甲乙双方修改的结
果 。 也即,在这种情况下,连数据的正确性都无法保证 。
加锁可以保证数据的一致性和正确性 。
第 13章 多用户操作
13.1.2 加锁,共享,冲突与死锁
所谓加锁 (Locking) 就 是 对 库 文 件 加 锁 (File
Locking)。 当用户甲对库文件 A加锁后,其他用户都不
能再使用此库文件 。
上述的加锁法虽然可以保证库文件数据的一致性
和正确性,但却不能使多个用户同时使用同一个库文件,
即破坏了共享 。
当用户甲要使用某库文件数据时 (不修改 ),如果不
在乎数据是否一致,他并不需要对库文件 A进行加锁 ; 但
若他要求数据必须一致,那么必须给库文件 A加锁 。
第 13章 多用户操作
加锁虽然可以保证数据的一致性和正确性,但加锁
也带来了两个新问题, 冲突和死锁 。 (Collision)。
当用户甲对库文件加锁,不允许其他用户使用此库
文件后,用户乙企图打开此库文件,就发生了冲突 。 或
者,当用户甲对库文件加锁,不允许其他用户修改此库
文件后,用户乙企图修改此库文件,也会发生冲突 。
死锁一般在多库文件操作时发生 。 用户甲对库文
件 A加锁,不允许其他用户使用,然后,准备使用库文件
B的数据 ; 但库文件 B已被用户乙加锁,不允许其他用户
使用,且用户乙也准备使用库文件 A的数据 。
第 13章 多用户操作
13.2 多用户 FoxPro 的加锁和
出错处理
13.2.1 多用户 FoxPro 的加锁
1.
在打开库文件的同时,对库文件进行的加锁为独占
加锁 。 独占加锁是最严厉的加锁 。 一个库文件被独
占加锁后,只有加锁用户可以使用该库文件,其他用户
无权打开此库文件,更谈不上修改,使用此库文件了 。
(1) 独占加锁法 。
第 13章 多用户操作
FoxPro提供了两种独占加锁的方法 。
① 使用 SET EXCLUSIVE命令,命令格式为,
SET EXCLUSIVE ON/OFF
执行了 SET EXCLUSIVE ON命令后,系统将处于
EXCLUSIVE ON状态 。 在此状态下,执行 USE命令打
开库文件时,若无特殊声明,被打开的库文件都是独占
加锁的 。 但是,该命令执行以前,未独占打开的库文件,
仍保持不独占加锁的特性 (共享特性 )。
第 13章 多用户操作
执行了 SET EXCLUSIVE OFF命令后,系统即处于
EXCLUSIVE OFF状态 。 在此状态下,利用 USE命令打
开库文件时,若无特殊声明,打开的库文件是不独占加
锁的 。 但是,此命令执行前,已独占加锁的库文件,仍
保持独占加锁的特性 。
观察下列程序段,
SET EXCLUSIVE ON
SELECT 1
USE 职工
SET EXCLUSIVE OFF
第 13章 多用户操作
SELECT B
USE 工资
上述程序若能执行成功,职工,DBF库文件独占加锁,
工资,DBF 未独占加锁 (可共享 )。
SET EXCLUSIVE的初始默认值为 ON。
② 打开库文件时,声明独占加锁 。 利用 USE命令
打开库文件时,若带有子句,
EXCLUSIVE
则打开的库文件是独占加锁的 。 即使刚执行过
SET EXCLUSIVE OFF命令,也是如此 。
第 13章 多用户操作
例
USE 职工 EXCLUSIVE
若此命令执行成功,职工,DBF库文件就被该用户独
占 。
③ 打开库文件时,声明可共享 。 利用 USE命令打开
库文件时,若带有子句,
SHARE
则打开的库文件是可共享的 。 即使刚执行过 SET
EXCLUSIVE ON命令,也是如此 。
第 13章 多用户操作
(2) 独占加锁的条件 。
只能对未被任何用户打开的库文件进行独占加锁 。
若一个库文件已被其他用户打开,用户再对它进行独占方
式打开时,系统将拒绝执行,并给出出错提示,
File is in USE by another 其他用户正在使用该文件
(3) 只能在独占方式下执行的命令 。
为保证数据的正确和一致,FoxPro规定一些命令只能
对独占库文件进行操作。
(4) 独占加锁解锁法 。
对于已独占打开的库文件来说,解锁的惟一方法是
关闭此库文件 。 否则,无法改变其独占状态 。
第 13章 多用户操作
2,函数加锁
对于已共享打开的库文件,还可用函数加锁的方法
对其加锁 。 函数加锁的方法有两种, 一种是对整个库
文件的加锁 ; 另一种是仅对个别记录的加锁 。
(1) 函数文件加锁 。
(2) 函数记录加锁 。
(3) 函数加锁的特点 。
(4) 多条记录加锁法 。
(5) 函数加锁的解锁 —— UNLOCK命令 。
(6) 函数加锁后才能执行的命令 。
第 13章 多用户操作
3,自动加锁
为了安全起见,在执行某些命令时,系统将首先对有
关记录或文件进行加锁 。 加锁成功,才执行命令,命令
执行完,自动解锁 。
(1) 自动对记录和文件头加锁 。
APPEND BLANK命令自动对所加空白记录和库文
件头加锁 。
(2) 自动对记录加锁 。
FoxPro在执行下列命令时,将自动对被操作的那个
记录加锁 。
第 13章 多用户操作
(3) 自动对文件加锁 。
有些命令将修改库文件中多个记录,FoxPro在执行
这些命令前首先执行自动对整个库文件的加锁 。
4,用控制键 ^O加锁
若欲对未加锁的库文件执行 CHANGE和 EDIT命令,
则在对记录操作前,必须用控制键 ^O对记录加锁 。 加
锁成功,才能修改该记录 ; 否则,将提示, Unable lock(不
能加锁 ),并且,不允许修改记录 。
。
第 13章 多用户操作
5,自动对文件加锁命令 ——SET LOCK
命令格式, SET LOCK ON/OFF
有些对库文件操作的命令,实际上只是利用库文件
中的数据,并不改变数据,这些命令也可称为只读命令
6,影响加锁执行时间的命令 ——SET REPROCESS
命令格式, SET REPROCESS TO 〈 数字表达式 〉
[ SECONDS] /TO AUTOMATIC
功能, 此命令规定,在一次不成功的加锁后,还继续
尝试多少次或多长时间加锁 。 ON ERROR将会影响此
功能 。
此命令可转化成多种格式,下面分别予以介绍 。
第 13章 多用户操作
(1) SET REPROCESS TO 0
(2) SET REPROCESS TO -1
(3) SET REPROCESS TO〈 数字表达式 〉,且 〈 数
字表达式 〉 值大于 0。
(4) SET REPROCESS TO〈 数字表达式 〉
SECONDS,且 〈 数字表达式 〉 大于 0。
(5) SET REPROCESS TO AUTOMATIC
第 13章 多用户操作
7,即时共享命令 ——SET REFRESH
命令格式, SET REFRESH TO〈 数字表达式 1〉
[,〈 数字表达式 2〉 ]
功能, 确定用户屏幕是否即时跟踪网络上其他用户
对数据的修改 。 网络中,允许共享某库文件 。
若 〈 数字表达式 1〉 为 0,则已打开浏览窗中的内容,
不随其他用户的修改而更新 (0 也是系统初始默认值 )。
若 〈 数字表达式 1〉 大于 0(最大为 3 600),其单位
为秒 (s),则每隔这段时间,浏览窗内容将根据最新内容,
更新一次 。
第 13章 多用户操作
当用户企图更新浏览窗某记录时,系统将自动对该
记录加锁。
SET REFRESH将影响 BROWSE CHANGE,EDIT
命令打开的浏览窗的内容,也将影响浏览窗中打开的修
改记忆型字段的编辑窗内容 。
网络中,用户工作站内存中的库文件,是存放在工
作站缓冲区中的 。 〈 数字表达式 2〉 决定每隔多长时
间 (单位为秒 (s)),缓冲区内容根据最新数据而更新 。
表达式 2〉 可在 0~3 600 之间,系统初始默认值为 5。
当设置为 0 时,不更新缓冲区内容 。
第 13章 多用户操作
13.2.2 多用户 FoxPro 的出错处理
出错处理就是冲突处理 。
从前面的介绍可知,在多用户状态下,发生冲突是很
正常的 。 因此,多用户状态必须具有处理冲突的能力 。
1,出错信息及相应出错号
(1) 出错信息, 其他用户正在使用该文件 。
(2) 出错信息, 其他用户正在使用该记录 。
(3) 出错信息, 需独占打开文件 。
(4) 出错信息, 记录没有加锁 。
(5) 出错信息, 非法的打印路径 (invalid printer
redirection)。
第 13章 多用户操作
2,冲突处理
在多用户状态下,只要库文件有可能被其他用户使用,
冲突就是一种正常现象 。
因此,用户程序中就必须有检测冲突,处理冲突的功能。
(1) 多用户 FoxPro中与冲突处理有关的 3 个函数如下:
① ERROR函数
② MESSAGE函数
③ SYS(16)函数。 SYS是一组函数,SYS(16)是其中之一。
第 13章 多用户操作
(2) 处理冲突命令 ——ON ERROR
命令格式, ON ERROR[ 〈 命令 〉 ]
功能, 规定程序出错后,应作何种处理 。
程序运行过程中,若出现错误,则执行 ON ERROR
指定的命令 。 一般地,是一条 DO命令,来处理错误 。
执行完指定命令后,程序回到出现错误命令的下一
条命令,继续执行 。 但是,处理错误过程中,常包含
RETRY语句,则又重新执行出现错误的那条命令 。
不带选择项的 ONERROR命令将中止前面 ON
ERROR命令的内容。
第 13章 多用户操作
例 如,若用户编制了处理冲突的子程序 ERR.PRG,
则 ON ERROR命令大致有以下两种格式,
ON ERROR DO ERR
ON ERROR DO ERR WITH ERROR( ),MESSAGE( ),
SYS(16)
前一格式命令执行后,只要发生冲突,将转去执行
ERR.PRG子程序 。 后一格式命令执行后,只要发生冲
突,将转去执行 ERR.PRG子程序,并且将出错参数带去 。
第 13章 多用户操作
13.3 死 锁 的 预 防
从两个方面来解决死锁问题, 预防和检测。
1,死锁的预防
虽然有不少人提出了不少预防死锁的方法,但在
FoxPro的应用系统中,最可行的方法只有一个, 对共享
库文件规定一个加锁顺序,并严格要求所有用户遵守此
规定 。
第 13章 多用户操作
2,死锁的检测
在 FoxPro应用系统中,要想准确检测到死锁是极其
困难的 。 一般的策略是, 当发生冲突后,经过有限次的
努力,仍然不能解决冲突,则逐步解锁自己已加锁的资
源 。 但是,这种策略增大了程序的复杂性,因此很少采
用 。 所以,对于 FoxPro应用系统来说,死锁问题以预防
为主 。