| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 86 人关注过本帖
标题:请教下VFP的事务处理的一点问题
只看楼主 加入收藏
kofan
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2025-7-27
结帖率:100%
收藏
 问题点数:0 回复次数:3 
请教下VFP的事务处理的一点问题
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编辑过]

搜索更多相关主题的帖子: 更新 where VFP set 字段 
前天 17:38
kofan
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2025-7-27
收藏
得分:0 
自己手动实践了下。
所有表都设置  一个字段有效性规则。库存>=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编辑过]

昨天 10:12
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:351
专家分:849
注 册:2014-6-12
收藏
得分:0 
回滚所有的更新
数据回滚到执行 BEGIN TRANSCATION 之前
昨天 15:21
kangss
Rank: 8Rank: 8
等 级:贵宾
威 望:14
帖 子:351
专家分:849
注 册:2014-6-12
收藏
得分:0 
执行前 ISTRANSACTABLE 判断一下
再执行 MAKETRANSACTABLE
最好是 ISTRANSACTABLE 再次判断
昨天 15:26
快速回复:请教下VFP的事务处理的一点问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.047908 second(s), 11 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved