3

我在我们的一个 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

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

问题是,如果插入失败,自治事务会被回滚,还是“当任何时候”阻止回滚并且会有一个打开的事务?我可以只删除异常处理,因此它会自动回滚而不引发异常并阻塞其余代码吗?

4

1 回答 1

2

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

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

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

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

于 2020-01-20T08:11:30.997 回答