LOCK() 函 数
尝试锁定表中一个或更多的记录
语 法
LOCK([ n W orkArea | cTableAlias ]
| [ cRecordNumberList , n W orkArea | cTableAlias ])
返 值 类 型
逻辑值
参 数 描 述
n W o rkArea | cTableAlias
尝 试 锁 定 指 定 工 作 区 中 已 打 开 表 的 当 前 记 录 nWorkArea 指 定 工 作 区 号cTableAlias 指 定 表 别 名 如 果 不 指 定 工 作 区 和 表 别 名 LOCK( ) 函 数 尝 试 锁定 当 前 工 作 区 中 的 表 的 当 前 记 录
cRecordNumberList
尝 试 锁 定 多 个 记 录 时 指 定 必 须 包 含 的 一 个 或 更 多 记 录 编 号 的 列 表 SET MULTILOCKS 必 须 为 ON 并 且 必 须 要 包 含 给 多 个 记 录 加 锁 的 工 作 区 或 表 的 别名
LOCK ( ) 函数尝试锁定您所指定的所有记录 cRecordNumberList 指定的记录编号之间用逗号分隔 例如尝试给某表的前四个记录加锁时 cRecordNumberList 应为 1,2,3,4
若要锁定多个记录 可以对其中的每一个记录重复下列步骤 移动记录指针指向要锁
定的记录 再发出 LOCK ( ) 或 RLOCK( ) 命令
在 Visual FoxPro 中 可以将 0 指定为记录编号 指定 0 时试图锁定表头
警 告 锁 定 表 头 的 时 间 应 尽 可 能 地 短 因 为 表 头 锁 定 时 其 他 用 户 不 能 向 表 中 添 加记 录
可以用 UNLOCK RECORD 0 UNLOCK 或 UNLOCK ALL 命令解除对表头的锁定如果在 cRecordNumbers 中指定的所有记录均锁定成功 LOCK( ) 函数返回 真
(.T.) 由 cRecordNumbers 指定的记录中即使有一个记录不能锁定 LOCK( ) 函数也将返回 假 (.F.) 并且不锁定任何记录 不过 原来已有的记录锁仍保留原样 多个记录的锁定是一个叠加过程 设置额外的记录锁并不释放对其他记录的锁定
在一个工作区中可以锁定的最大记录数约为 8000 锁定整个表的速度总是比只锁定一部分记录要快
说 明
LOCK ( ) 函数与 RLOCK( ) 函数等价
如果成功地设置了锁定和解锁 则 L OCK() 返 回 真 (.T.) 设置锁定的用户对锁定的记录有读写权限 而网络上的其他用户有只读权限
执行 LOCK ( ) 函数并不保证记录锁设置成功 不能对已由另一用户锁定的记录或位于其他用户锁定的表中的记录设置记录锁 如果由于某种原因不能设置记录锁 LOCK( ) 函数将返回 假 (.F.)
在默认情况下 LOCK ( ) 函数尝试锁定记录一次 使用 SET REPROCESS 命令可以在第一次尝试失败后自动地重设记录锁 SET REPROCESS 确定初始锁定失败时锁定操作的尝试次数或锁定尝试应当持续的时间 详细内容 请 参阅稍后的
SET REPROCESS 命 令
SET MULTILOCKS 决定能否锁定表中的多个记录 如果 SET MULTILOCKS 为 OFF
默认值 则只能锁定表中的单个记录 而 SET MULTILOCKS 为 ON 时 可以锁定表中的多个记录 详细内容 请 参阅稍后的 SET MULTILOCKS 命 令
对 记 录 解 锁 表记录只能由设置锁定的用户进行解锁 发出 UNLOCK 命令 关闭表或退出 Visual FoxPro 都可以释放记录锁定
UNLOCK 可用于释放当前工作区 指定的工作区或所有工作区中的记录锁定 详细内容 请 参阅稍后的 UNLOCK 命 令
将 SET MULTILOCKS 从 ON 转换到 OFF 或从 OFF 转换到 ON 即隐含地执行了
UNLOCK ALL 释放所有工作区中的记录锁定
可以用 USE CLEAR ALL 或 CLOSE DATABASES 命令来关闭表
有关 网络上的记录 文件锁定和共享表的 详细内容 请参阅 Microsoft Visual FoxPro
6.0 中文版程序员指南 的第 十七 章 共享访问程序设计
示 例
下面的示例对 customer 和 employee 表中的前四个记录设置锁定和解锁
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata') SET REPROCESS TO 3 AUTOMATIC
STORE '1,2,3,4' TO gcRecList
gcOldExc = SET('EXCLUSIVE') SET EXCLUSIVE OFF SELECT 0
USE employee && 打开 Employee 表
SELECT 0
USE customer && 打开 Customer 表
? LOCK ('1,2,3,4', 'customer') && 锁住 customer 表的前四个记录
? RLOCK(gcRecList, 'employee') && 锁住 employee 表的前四个记录
UNLOCK IN customer UNLOCK IN employee
SET EXCLUSIVE &gcOldExc
请 参 阅
CLEAR, CLOSE, FLOCK ( ), RLOCK( ), SET MULTILOCKS, SET
REPROCESS, UNLOCK, USE