展开全部
如果要共享访问文件,也必须要通过锁定表和记录来管理对数据的访问。锁定不同于访问权限,提供了对数据的长期和短期控制。Visual FoxPro
提供自动和手动两种锁定。
选择记录或表锁定
记录锁定,无论是自动还是手动,都是防止一个以上的用户同时写一个记录。表锁定防止了其他用户的写入,而不是读取整个表。由于表锁定阻止了其他用户更新表中记录,而应当避免使用。
选择自动或手动锁定
除记录或表锁定以外,还可以选择自动或者手动锁定。很多 Visual FoxPro
命令在执行之前都会尝试自动锁定一个记录或一个表。如果成功锁定了记录或表,则执行该命令,然后再释放该锁定。
自动锁定记录和表的命令
命令
锁定范围
ALTER TABLE
整个表
APPEND
表头
APPEND BLANK
表头
APPEND FROM
表头
APPEND FROM
ARRAY
表头
APPEND MEMO
当前记录
BLANK
当前记录
BROWSE,CHANGE 和 EDIT
一旦开始编辑字段,当前记录和相关表中别名字段的所有记录
CURSORSETPROP(
)
取决于参数
DELETE
当前记录
DELETE NEXT 1
当前记录
DELETE RECORD
n
记录 n
DELETE
多记录
整个表
DELETE – SQL
当前记录
GATHER
当前记录
INSERT
整个表
INSERT - SQL
表头
MODIFY MEMO
编辑开始时的当前记录
READ
当前记录和别名字段的所有记录
RECALL
当前记录
RECALL NEXT 1
当前记录
RECALL RECORD
n
记录 n
RECALL
多记录
整个表
REPLACE
当前记录和别名字段的所有记录
REPLACE NEXT
1
当前记录和别名字段的所有记录
REPLACE RECORD
n
记录 n 和别名字段的所有记录
REPLACE 多记录
整个表和别名字段的所有记录
SHOW GETS
当前记录和别名字段引用的所有记录
TABLEUPDATE(
)
取决于缓冲
UPDATE
整个表
UPDATE – SQL
整个表
记录锁定的特点
试图锁定记录命令的限制少于锁定表的命令。当锁定记录时,其他用户仍然可以添加或删除其他记录。如果记录或表已经被其他用户锁定,锁定记录或表的尝试失败。如果该记录不能被锁定,试图锁定当前记录的命令返回该错误“记录正在被其他用户使用”。
BROWSE,CHANGE,EDIT 和 MODIFY MEMO
命令只在编辑记录时才锁定记录。如果正在编辑相关表记录中的字段,则相关记录可能被锁定。如果当前记录或任何相关记录也被其他用户锁定,则锁定尝试失败。如果锁定尝试成功,则可以编辑该记录;当移到其他记录或激活其他窗口时,该锁定被释放。
表头和表锁定的特点
某些 Visual FoxPro 命令锁定整个表,虽然其他命令只锁定表头。锁定整个表命令比锁定表头命令的限制更严厉。锁定表头时,其他用户不能添加记录,但仍然可以修改字段中的数据。
当发出 APPEND BLANK
命令时,用户可以共享该表而不会引起冲突,但当其他用户也在将空白(BLANK)记录追加到该表时会出现错误。可以捕获两个或多个用户同时执行 APPEND BLANK
时返回的“文件正在被其他用户使用”错误。如果不能锁定表,锁定整个表的命令返回“文件正在被其他用户使用”的错误。要取消锁定的尝试,按
ESC。
自动锁定
在下面示例中,用户通过追加其他表中的记录自动锁定表头,即使 customer 是作为共享文件被打开的:
复制代码
SET EXCLUSIVE OFF
USE customer
APPEND FROM oldcust FOR status = "OPEN"
手动锁定
可以使用下列锁定函数之一手动锁定一个记录或表:
RLOCK( ) 函数
LOCK( ) 函数
FLOCK( )
函数
LOCK( ) 和 RLOCK( ) 函数可用于锁定表头。如果提供 0
作为 LOCK( ) 或
RLOCK( ) 的记录并测试表明未锁定表头,该函数锁定表头并返回真(.T.)。
一旦锁定了记录或表,要确定通过使用 UNLOCK
命令释放该锁定,以尽快提供给其他用户访问。
这些手动锁定函数完成下列动作:
测试记录或表的锁定状态。
如果测试表明该记录未被锁定,则锁定该记录或表并返回真(.T.)。
如果不能锁定该记录或表,则根据 SET REPROCESS
的当前设置再次尝试锁定记录或表。
返回真(.T.)或假(.F.),表明锁定尝试是否成功。
提示:
如果要测试工作期中记录的锁定状态而不锁定该记录,使用
ISRLOCKED( ) 或 ISFLOCKED( )
函数。
如果锁定记录或表的尝试失败,SET REPROCESS 命令和当前错误例程将确定是否再次尝试锁定。SET REPROCESS
会影响不成功的锁定尝试结果。可以使用 SET
REPROCESS 控制锁定尝试的次数或时间。
下面示例以共享访问方式打开了 customer 表并使用 FLOCK( ) 尝试锁定该表。如果成功锁定该表,则
REPLACE ALL 更新表中的所有记录。UNLOCK
释放该文件锁定。如果由于其他用户已经锁定该文件或文件中的记录而不能锁定该文件时,将显示一条信息。
复制代码
SET EXCLUSIVE OFF
SET REPROCESS TO 0
USE customer && 共享打开表
IF FLOCK()
REPLACE ALL contact ; && 替换并解锁
WITH UPPER(contact)
UNLOCK
ELSE && 输出信息
WAIT "File in use by another." WINDOW NOWAIT
ENDIF
解锁数据
在共享环境下建立记录或文件锁定并完成了数据操作之后,应尽快释放该锁定。有几种释放锁定的办法。有时,只是移到下一条记录就足以解锁数据。其他情况则需要明确的命令。
要解锁被自动锁定的记录,只需移动记录指针,即使设置了 MULTILOCKS ON。必须明确地移去手动锁定记录上的锁定,仅仅移动记录指针是不够的。
下表描述了手动和自动的记录和表锁定上命令的影响。
命令
作用
UNLOCK
释放当前工作区中记录和文件锁定。
UNLOCK ALL
释放当前数据工作期所有工作区中的所有锁定。
SET MULTILOCKS
OFF
允许建立新锁定的同时自动释放当前锁定。
FLOCK( )
在锁定文件之前释放受影响文件中的所有记录锁定。
CLEAR ALL,CLOSE ALL,USE,QUIT
释放所有记录和文件锁定。
END
TRANSACTION
释放自动锁定。
TABLEUPDATE(
)
更新该表后释放所有锁定。
警告:
如果记录在自定义函数中被自动锁定并且移开记录指针然后又移回该记录时,锁定将被解除。使用表缓冲避免该问题。
提供自动和手动两种锁定。
选择记录或表锁定
记录锁定,无论是自动还是手动,都是防止一个以上的用户同时写一个记录。表锁定防止了其他用户的写入,而不是读取整个表。由于表锁定阻止了其他用户更新表中记录,而应当避免使用。
选择自动或手动锁定
除记录或表锁定以外,还可以选择自动或者手动锁定。很多 Visual FoxPro
命令在执行之前都会尝试自动锁定一个记录或一个表。如果成功锁定了记录或表,则执行该命令,然后再释放该锁定。
自动锁定记录和表的命令
命令
锁定范围
ALTER TABLE
整个表
APPEND
表头
APPEND BLANK
表头
APPEND FROM
表头
APPEND FROM
ARRAY
表头
APPEND MEMO
当前记录
BLANK
当前记录
BROWSE,CHANGE 和 EDIT
一旦开始编辑字段,当前记录和相关表中别名字段的所有记录
CURSORSETPROP(
)
取决于参数
DELETE
当前记录
DELETE NEXT 1
当前记录
DELETE RECORD
n
记录 n
DELETE
多记录
整个表
DELETE – SQL
当前记录
GATHER
当前记录
INSERT
整个表
INSERT - SQL
表头
MODIFY MEMO
编辑开始时的当前记录
READ
当前记录和别名字段的所有记录
RECALL
当前记录
RECALL NEXT 1
当前记录
RECALL RECORD
n
记录 n
RECALL
多记录
整个表
REPLACE
当前记录和别名字段的所有记录
REPLACE NEXT
1
当前记录和别名字段的所有记录
REPLACE RECORD
n
记录 n 和别名字段的所有记录
REPLACE 多记录
整个表和别名字段的所有记录
SHOW GETS
当前记录和别名字段引用的所有记录
TABLEUPDATE(
)
取决于缓冲
UPDATE
整个表
UPDATE – SQL
整个表
记录锁定的特点
试图锁定记录命令的限制少于锁定表的命令。当锁定记录时,其他用户仍然可以添加或删除其他记录。如果记录或表已经被其他用户锁定,锁定记录或表的尝试失败。如果该记录不能被锁定,试图锁定当前记录的命令返回该错误“记录正在被其他用户使用”。
BROWSE,CHANGE,EDIT 和 MODIFY MEMO
命令只在编辑记录时才锁定记录。如果正在编辑相关表记录中的字段,则相关记录可能被锁定。如果当前记录或任何相关记录也被其他用户锁定,则锁定尝试失败。如果锁定尝试成功,则可以编辑该记录;当移到其他记录或激活其他窗口时,该锁定被释放。
表头和表锁定的特点
某些 Visual FoxPro 命令锁定整个表,虽然其他命令只锁定表头。锁定整个表命令比锁定表头命令的限制更严厉。锁定表头时,其他用户不能添加记录,但仍然可以修改字段中的数据。
当发出 APPEND BLANK
命令时,用户可以共享该表而不会引起冲突,但当其他用户也在将空白(BLANK)记录追加到该表时会出现错误。可以捕获两个或多个用户同时执行 APPEND BLANK
时返回的“文件正在被其他用户使用”错误。如果不能锁定表,锁定整个表的命令返回“文件正在被其他用户使用”的错误。要取消锁定的尝试,按
ESC。
自动锁定
在下面示例中,用户通过追加其他表中的记录自动锁定表头,即使 customer 是作为共享文件被打开的:
复制代码
SET EXCLUSIVE OFF
USE customer
APPEND FROM oldcust FOR status = "OPEN"
手动锁定
可以使用下列锁定函数之一手动锁定一个记录或表:
RLOCK( ) 函数
LOCK( ) 函数
FLOCK( )
函数
LOCK( ) 和 RLOCK( ) 函数可用于锁定表头。如果提供 0
作为 LOCK( ) 或
RLOCK( ) 的记录并测试表明未锁定表头,该函数锁定表头并返回真(.T.)。
一旦锁定了记录或表,要确定通过使用 UNLOCK
命令释放该锁定,以尽快提供给其他用户访问。
这些手动锁定函数完成下列动作:
测试记录或表的锁定状态。
如果测试表明该记录未被锁定,则锁定该记录或表并返回真(.T.)。
如果不能锁定该记录或表,则根据 SET REPROCESS
的当前设置再次尝试锁定记录或表。
返回真(.T.)或假(.F.),表明锁定尝试是否成功。
提示:
如果要测试工作期中记录的锁定状态而不锁定该记录,使用
ISRLOCKED( ) 或 ISFLOCKED( )
函数。
如果锁定记录或表的尝试失败,SET REPROCESS 命令和当前错误例程将确定是否再次尝试锁定。SET REPROCESS
会影响不成功的锁定尝试结果。可以使用 SET
REPROCESS 控制锁定尝试的次数或时间。
下面示例以共享访问方式打开了 customer 表并使用 FLOCK( ) 尝试锁定该表。如果成功锁定该表,则
REPLACE ALL 更新表中的所有记录。UNLOCK
释放该文件锁定。如果由于其他用户已经锁定该文件或文件中的记录而不能锁定该文件时,将显示一条信息。
复制代码
SET EXCLUSIVE OFF
SET REPROCESS TO 0
USE customer && 共享打开表
IF FLOCK()
REPLACE ALL contact ; && 替换并解锁
WITH UPPER(contact)
UNLOCK
ELSE && 输出信息
WAIT "File in use by another." WINDOW NOWAIT
ENDIF
解锁数据
在共享环境下建立记录或文件锁定并完成了数据操作之后,应尽快释放该锁定。有几种释放锁定的办法。有时,只是移到下一条记录就足以解锁数据。其他情况则需要明确的命令。
要解锁被自动锁定的记录,只需移动记录指针,即使设置了 MULTILOCKS ON。必须明确地移去手动锁定记录上的锁定,仅仅移动记录指针是不够的。
下表描述了手动和自动的记录和表锁定上命令的影响。
命令
作用
UNLOCK
释放当前工作区中记录和文件锁定。
UNLOCK ALL
释放当前数据工作期所有工作区中的所有锁定。
SET MULTILOCKS
OFF
允许建立新锁定的同时自动释放当前锁定。
FLOCK( )
在锁定文件之前释放受影响文件中的所有记录锁定。
CLEAR ALL,CLOSE ALL,USE,QUIT
释放所有记录和文件锁定。
END
TRANSACTION
释放自动锁定。
TABLEUPDATE(
)
更新该表后释放所有锁定。
警告:
如果记录在自定义函数中被自动锁定并且移开记录指针然后又移回该记录时,锁定将被解除。使用表缓冲避免该问题。
ZESTRON
2024-09-04 广告
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸...
点击进入详情页
本回答由ZESTRON提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询