gpt4 book ai didi

自治事务中的 Firebird 2.5 异常处理

转载 作者:行者123 更新时间:2023-12-02 02:40:32 28 4
gpt4 key购买 nike

我的 Firebird 存储过程之一出现性能下降,我不知道为什么。我在提到的 SP 中找到了以下代码:

declare v_dummy integer;
...
in autonomous transaction do
begin
-- insert may fail, but that is not a problem because it means the record is already there
insert into my_table(my_field) values (:input_param);
when ANY do
v_dummy = 1;
end

我在 RDB$TRANSACTIONS 表中看到几十条状态为 3 的记录,在 MON$TRANSACTIONS 表中没有相关记录。

问题是,如果插入失败,自主事务是否会被回滚,或者“when ANY do”会阻止回滚并且会有一个打开的事务?我可以只删除异常处理,以便它自动回滚而不引发异常并阻止其余代码吗?

最佳答案

在自治事务 block 内使用when any do回滚事务,而是在 block 结束后提交,因为异常不会逃逸 block 。

然而,这可能是期望的结果:在 Firebird 中提交事务(相对)比回滚便宜。事实上,如果事务在没有任何更改的情况下回滚,Firebird 无论如何都会将回滚转换为提交。

我认为这不是导致性能问题的原因,但没有可重现的示例,很难对此进行推理。

顺便说一句,状态 3 的事务被回滚,并且回滚的事务已经结束。 MON$TRANSACTIONS 仅显示事件事务,因此回滚事务不会显示在该虚拟表中。

关于自治事务中的 Firebird 2.5 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814545/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com