BEGIN TRANSACTION 命令
启动一个事务处理。仅对数据库中的表支持事务处理。
有关如何在数据库中创建和增加表的详细信息,请参阅CREATE DATABASE 和 ADD TABLE。
BEGIN TRANSACTION
备注
为了保存所做的修改并终止事务处理,应发出 END TRANSACTION 命令。如果事务处理失败(如服务器有故障或工作站有故障,以及没有提交事务处理就退出 Visual FoxPro),或者用户发出 ROLLBACK 命令,事务处理中的文件就恢复成原状态。
事务处理最深可嵌套五层,如果要进行第六层嵌套,则产生错误。
当修改一个数据库的记录,而该数据库又是事务处理的一部分时,网络上的其他用户在您终止事务处理之前无法访问(读或写)这些记录。
如果网络上的其他用户要访问您已经修改的记录,就必须等待您终止事务处理。在记录可用之前,用户将一直收到“记录不可用...请等待”的消息。因此,减小事务处理长度或在其他用户不需要访问期间进行事务处理就变得非常重要。
所有 IDX 索引文件 (非结构化, 或非基于 CDX 索引) 在事务处理期间必须关闭。在事务处理中只支持结构化索引。
在事务处理期间不支持下列命令和函数:
命令和函数
ADD TABLE DELETE CONNECTION
APPEND PROCEDURES DELETE DATABASE
CLEAR ALL DELETE TRIGER
CLOSE ALL1 DELETE VIEW
CLOSE DATABASES1 MODIFY CONNECTION
COPY INDEXES MODIFY DATABASE
COPY PROCEDURES MODIFY PROCEDURE
CREATE CONNECTION MODIFY VIEW
CREATE DATABASE Remove Table
CREATE TRIGGER RENAME TABLE
CREATE VIEW REQUERY()
CREATE SQL VIEW
1 在事务处理期间执行 CLOSE ALL 命令,则关闭所有打开数据库中的表,但数据库仍保持打开状态;在事务处理期间执行 CLOSE DATABASES 命令,则关闭当前数据库中的所有表,但数据库仍保持打开状态。
另外, 不能对参与事务处理的表使用以下命令和函数:
命令和函数
ALTER TABLE MODIFY STRUCTURE
CREATE TABLE PACK
CURSORSETPROP() REINDEX
DELETE TAG TABLEREVERT()
INDEX ZAP
INSERT
示例
在下面示例中,打开数据库 testdata 的 customer 表,为 customer 表设置开放式表缓冲。接着显示 cust_id 和 company 字段内容。然后用缓存的数据替换 company 字段内容。
发出 BEGIN TRANSACTION 命令来启动一个事务处理。用 TABLEUPDATE() 把修改写到表中,再显示新的字段内容。发送 rollback 命令来恢复 company 字段的原来内容,然后再次显示 cust_id 和 company 字段的内容,这时的 company 字段保持原值。
CLEAR
CLOSE DATABASES
* 事务处理只支持数据库
OPEN DATABASE (HOME(2) + 'Data\testdata')
SET MULTILOCKS ON && 要求缓存
USE customer
=CURSORSETPROP("Buffering",5)
? '原来的 company 字段'
LIST FIELDS cust_id, company NEXT 5
Replace All company WITH "***" && 修改字段内容
BEGIN TRANSACTION
=TABLEUPDATE(.T.)
GO TOP
? '修改后的 company 字段'
LIST FIELDS cust_id, company NEXT 5
ROLLBACK && 恢复原始字段内容
=TABLEREVERT(.T.)
GO TOP
? '恢复后的 company 字段'
LIST FIELDS cust_id, company NEXT 5
评论