注册 登录
编程论坛 VFP论坛

请教下VFP的事务处理的一点问题

kofan 发布于 2025-09-22 17:38, 918 次点击
BEGIN TRANSCATION
UPDATE table_a set 字段a=* where ...
UPDATE table_b set 字段b=* where ...
UPDATE table_c set 字段c=* where ...
END TRANSCATION

3张表未开启缓冲
问题1、如果3条更新语句中,有更新失败的,以上代码会回滚所有的更新吗?

问题2、如何检测这3条语句中,哪些更新失败?

请大佬解答下。

[此贴子已经被作者于2025-9-23 09:29编辑过]

5 回复
#2
kofan2025-09-23 10:12
自己手动实践了下。
所有表都设置  一个字段有效性规则。库存>=0。
test1、test2、test3 表都初始化一条记录,序号1、库存1.
将下列语句放在一个表单的按钮里。点击按钮执行。

BEGIN TRANSACTION
UPDATE test1 SET 库存=3 WHERE 序号=1
UPDATE test2 SET 库存=-1 WHERE 序号=1
UPDATE test3 SET 库存=2 WHERE 序号=1
END TRANSACTION

第2条开始更新失败,那么程序会报错,提示失败的信息“比如违反字段规则”。
程序会在第2条语句失败后挂起。
手动终止程序后。
执行txnlevel()查看,事务并没有结束。
手动执行 end transcation,结束事务处理。
第一条语句的更新,test1的库存变为3。
因此没有回滚

检测哪条错误,将代码整体放入try catch语句中
BEGIN TRANSACTION
TRY
    UPDATE test1 SET 库存=3 WHERE 序号=1
    UPDATE test2 SET 库存=-1 WHERE 序号=1
    UPDATE test3 SET 库存=2 WHERE 序号=1
    END TRANSACTION
CATCH TO cErr
    ?cErr.ErrorNo    &&错误号,这里是1582
    ?cErr.Message    &&错误信息
    ?cErr.LineContents    &&执行失败的语句
    ?cErr.LineNo    &&执行失败语句的行号
    ?cErr.Details    &&错误的细节信息
    ?cErr.Procedure    &&产生错误的过程或程序
    ROLLBACK
ENDTRY
这样,能看见错误的信息,并能在出现错误时,回滚所有更改。

[此贴子已经被作者于2025-9-23 11:25编辑过]

#3
kangss2025-09-23 15:21
回滚所有的更新
数据回滚到执行 BEGIN TRANSCATION 之前
#4
kangss2025-09-23 15:26
执行前 ISTRANSACTABLE 判断一下
再执行 MAKETRANSACTABLE
最好是 ISTRANSACTABLE 再次判断
#5
kofan2025-09-24 09:08
回复 4楼 kangss
忘记说了。是数据库的表,而不是自由表。应该不需要ISTRANSACTABLE
#6
hsfisher2025-09-28 08:21
学习中
1