RLOCK() 函 数
尝试给一个或多个表记录加锁
语 法
RLOCK([ n W orkArea | cTableAlia s]
| [ cRecordNumberLis t , n W orkArea | cTableAlias ])
返 值 类 型
逻辑值
参 数 描 述
n W o rkArea | cTableAlias
指 定 表 所 在 的 工 作 区 编 号 或 表 别 名 如 果 不 指 定 工 作 区 或 别 名 则 RLOCK ( )
试 图 对 当 前 选 定 工 作 区 中 表 的 当 前 记 录 加 锁
cRecordNumberList
指 定 RLOCK ( ) 尝 试 锁 定 的 多 个 记 录 字 符 表 达 式 cRecordNumberList 指定 一 个 或 多 个 要 RLOCK( ) 尝 试 锁 定 的 记 录 的 编 号 多 个 记 录 的 编 号 之 间 用逗 号 隔 开 例 如 要 对 表 中 前 四 个 记 录 加 锁 cRecordNumberList 应 该 为 1
2 3 4
要锁定多个记录 SET MULTILOCKS 必须设置为 ON 并且必须指定表所在的工作区号 nWorkArea 或表的别名 cTableAlias
要锁定多个记录 可以将记录指针移动到要锁定的记录上 执行 RLOCK ( ) 或 LOCK( )
命令将这个记录锁定 然后多次重复这个过程
在 Visual FoxPro 中 可以指定 0 作为记录编号 指 定 0 表示要锁定表头
重 要 提 示 锁 定 表 头 的 时 间 要 尽 可 能 短 因 为 表 头 锁 定 期 间 其 他 用 户 不 能 向 表中 添 加 记 录
对表头解锁可以用 UNLOCK RECORD 0 或 UNLOCK 或 UNLOCK ALL 等命令 如果成功地锁定了所有 cRecordNumberList 之中的记录 则 RLOCK( ) 返回 真 (.T.)
如果 cRecordNumberList 指定的记录有一个或多个不能加锁 则 RLOCK( ) 返回 假(.F.) 并且对指定的任何记录都不加锁 以上两种情况中 原来已有的记录锁保持不变多个记录加锁是一个递增过程 即添加新的记录锁时并不释放原有的记录锁
出于运行效率方面考虑 锁定整个表一般比锁定部分记录 哪怕是很少几个 要快
说 明
RLOCK ( ) 等同于 |
LOCK( ) |
|||||
---|---|---|---|---|---|---|
如果加锁成功 则 |
RLOCK ( ) |
返回 |
真 |
(.T.) |
此时 |
锁定的记录对于加锁的用户既 |
可读也可写 而对于网络上的其他用户只读
执行 RLOCK ( ) 并不能保证每次加锁都成功 如果一个记录已由一个用户加锁 则其他用户不能对这个记录加锁 如果一个表已由一个用户加锁 则其他用户不能对这个表中的记录加锁 不管什么理由 只要记录不能加锁 RLOCK( ) 就返回 假 (.F.)
默认情况下 RLOCK ( ) 给记录加锁时只尝试一次 要想在第一次加锁尝试失败后自动重试加锁过程 应使用 SET REPROCESS 命令 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
请 参 阅
CLEA R , CLOSE , FLOCK ( ) , LOCK( ) , SET MULTILOCK S , SET RELATION ,
SET REPROCESS , UNLOCK , USE