LOCK() 函 数

LOCK() 函 数 - 图1尝试锁定表中一个或更多的记录

语 法

LOCK([ n W orkArea | cTableAlias ]

| [ cRecordNumberList , n W orkArea | cTableAlias ])

返 值 类 型

逻辑值

参 数 描 述

n W o rkArea | cTableAlias

LOCK() 函 数 - 图2LOCK() 函 数 - 图3LOCK() 函 数 - 图4LOCK() 函 数 - 图5LOCK() 函 数 - 图6尝 试 锁 定 指 定 工 作 区 中 已 打 开 表 的 当 前 记 录 nWorkArea 指 定 工 作 区 号cTableAlias 指 定 表 别 名 如 果 不 指 定 工 作 区 和 表 别 名 LOCK( ) 函 数 尝 试 锁定 当 前 工 作 区 中 的 表 的 当 前 记 录

cRecordNumberList

LOCK() 函 数 - 图7LOCK() 函 数 - 图8LOCK() 函 数 - 图9LOCK() 函 数 - 图10尝 试 锁 定 多 个 记 录 时 指 定 必 须 包 含 的 一 个 或 更 多 记 录 编 号 的 列 表 SET MULTILOCKS 必 须 为 ON 并 且 必 须 要 包 含 给 多 个 记 录 加 锁 的 工 作 区 或 表 的 别名

LOCK() 函 数 - 图11LOCK() 函 数 - 图12LOCK() 函 数 - 图13LOCK() 函 数 - 图14LOCK ( ) 函数尝试锁定您所指定的所有记录 cRecordNumberList 指定的记录编号之间用逗号分隔 例如尝试给某表的前四个记录加锁时 cRecordNumberList 应为 1,2,3,4

LOCK() 函 数 - 图15LOCK() 函 数 - 图16若要锁定多个记录 可以对其中的每一个记录重复下列步骤 移动记录指针指向要锁

LOCK() 函 数 - 图17LOCK() 函 数 - 图18定的记录 再发出 LOCK ( ) 或 RLOCK( ) 命令

LOCK() 函 数 - 图19LOCK() 函 数 - 图20LOCK() 函 数 - 图21在 Visual FoxPro 中 可以将 0 指定为记录编号 指定 0 时试图锁定表头

LOCK() 函 数 - 图22LOCK() 函 数 - 图23警 告 锁 定 表 头 的 时 间 应 尽 可 能 地 短 因 为 表 头 锁 定 时 其 他 用 户 不 能 向 表 中 添 加记 录

LOCK() 函 数 - 图24LOCK() 函 数 - 图25LOCK() 函 数 - 图26LOCK() 函 数 - 图27LOCK() 函 数 - 图28可以用 UNLOCK RECORD 0 UNLOCK 或 UNLOCK ALL 命令解除对表头的锁定如果在 cRecordNumbers 中指定的所有记录均锁定成功 LOCK( ) 函数返回 真

LOCK() 函 数 - 图29LOCK() 函 数 - 图30LOCK() 函 数 - 图31LOCK() 函 数 - 图32LOCK() 函 数 - 图33LOCK() 函 数 - 图34LOCK() 函 数 - 图35LOCK() 函 数 - 图36LOCK() 函 数 - 图37(.T.) 由 cRecordNumbers 指定的记录中即使有一个记录不能锁定 LOCK( ) 函数也将返回 假 (.F.) 并且不锁定任何记录 不过 原来已有的记录锁仍保留原样 多个记录的锁定是一个叠加过程 设置额外的记录锁并不释放对其他记录的锁定

LOCK() 函 数 - 图38LOCK() 函 数 - 图39在一个工作区中可以锁定的最大记录数约为 8000 锁定整个表的速度总是比只锁定一部分记录要快

说 明

LOCK() 函 数 - 图40LOCK ( ) 函数与 RLOCK( ) 函数等价

LOCK() 函 数 - 图41LOCK() 函 数 - 图42LOCK() 函 数 - 图43LOCK() 函 数 - 图44LOCK() 函 数 - 图45LOCK() 函 数 - 图46如果成功地设置了锁定和解锁 则 L OCK() 返 回 真 (.T.) 设置锁定的用户对锁定的记录有读写权限 而网络上的其他用户有只读权限

LOCK() 函 数 - 图47LOCK() 函 数 - 图48LOCK() 函 数 - 图49LOCK() 函 数 - 图50LOCK() 函 数 - 图51LOCK() 函 数 - 图52执行 LOCK ( ) 函数并不保证记录锁设置成功 不能对已由另一用户锁定的记录或位于其他用户锁定的表中的记录设置记录锁 如果由于某种原因不能设置记录锁 LOCK( ) 函数将返回 假 (.F.)

LOCK() 函 数 - 图53LOCK() 函 数 - 图54LOCK() 函 数 - 图55LOCK() 函 数 - 图56LOCK() 函 数 - 图57在默认情况下 LOCK ( ) 函数尝试锁定记录一次 使用 SET REPROCESS 命令可以在第一次尝试失败后自动地重设记录锁 SET REPROCESS 确定初始锁定失败时锁定操作的尝试次数或锁定尝试应当持续的时间 详细内容 请 参阅稍后的

LOCK() 函 数 - 图58SET REPROCESS 命 令

LOCK() 函 数 - 图59SET MULTILOCKS 决定能否锁定表中的多个记录 如果 SET MULTILOCKS 为 OFF

LOCK() 函 数 - 图60LOCK() 函 数 - 图61LOCK() 函 数 - 图62LOCK() 函 数 - 图63LOCK() 函 数 - 图64LOCK() 函 数 - 图65LOCK() 函 数 - 图66LOCK() 函 数 - 图67默认值 则只能锁定表中的单个记录 而 SET MULTILOCKS 为 ON 时 可以锁定表中的多个记录 详细内容 请 参阅稍后的 SET MULTILOCKS 命 令

LOCK() 函 数 - 图68LOCK() 函 数 - 图69LOCK() 函 数 - 图70对 记 录 解 锁 表记录只能由设置锁定的用户进行解锁 发出 UNLOCK 命令 关闭表或退出 Visual FoxPro 都可以释放记录锁定

LOCK() 函 数 - 图71LOCK() 函 数 - 图72LOCK() 函 数 - 图73LOCK() 函 数 - 图74UNLOCK 可用于释放当前工作区 指定的工作区或所有工作区中的记录锁定 详细内容 请 参阅稍后的 UNLOCK 命 令

将 SET MULTILOCKS 从 ON 转换到 OFF 或从 OFF 转换到 ON 即隐含地执行了

LOCK() 函 数 - 图75UNLOCK ALL 释放所有工作区中的记录锁定

LOCK() 函 数 - 图76LOCK() 函 数 - 图77可以用 USE CLEAR ALL 或 CLOSE DATABASES 命令来关闭表

LOCK() 函 数 - 图78LOCK() 函 数 - 图79LOCK() 函 数 - 图80有关 网络上的记录 文件锁定和共享表的 详细内容 请参阅 Microsoft Visual FoxPro

LOCK() 函 数 - 图81LOCK() 函 数 - 图82LOCK() 函 数 - 图83LOCK() 函 数 - 图846.0 中文版程序员指南 的第 十七 章 共享访问程序设计

示 例

LOCK() 函 数 - 图85下面的示例对 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