自治事务中的 Firebird 2.5 异常处理
Firebird 2.5 exception handling within autonomous transaction
我的一个 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
table 中看到几十条状态为 3 的记录,在 MON$TRANSACTIONS table.
中没有相关记录
问题是,如果插入失败,自治事务会被回滚,还是"when ANY do"阻止回滚,会有一个打开的事务?我可以只删除异常处理,这样它就会自动回滚而不会引发异常并阻止其余代码吗?
在自治事务块中使用 when any do
将 不会 回滚事务,而是在块结束后提交,因为异常不会逃逸块。
然而,这可能是期望的结果:在 Firebird 中提交事务(相对)比回滚便宜。事实上,如果事务在没有任何更改的情况下回滚,Firebird 无论如何都会将回滚转换为提交。
我不认为这是你的性能问题的原因,但没有可重现的例子,很难推断出这一点。
顺便说一句,状态 3 的事务被回滚,并且回滚的事务已经结束。 MON$TRANSACTIONS
仅显示活动事务,因此回滚事务不会显示在该虚拟 table。
我的一个 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
table 中看到几十条状态为 3 的记录,在 MON$TRANSACTIONS table.
问题是,如果插入失败,自治事务会被回滚,还是"when ANY do"阻止回滚,会有一个打开的事务?我可以只删除异常处理,这样它就会自动回滚而不会引发异常并阻止其余代码吗?
在自治事务块中使用 when any do
将 不会 回滚事务,而是在块结束后提交,因为异常不会逃逸块。
然而,这可能是期望的结果:在 Firebird 中提交事务(相对)比回滚便宜。事实上,如果事务在没有任何更改的情况下回滚,Firebird 无论如何都会将回滚转换为提交。
我不认为这是你的性能问题的原因,但没有可重现的例子,很难推断出这一点。
顺便说一句,状态 3 的事务被回滚,并且回滚的事务已经结束。 MON$TRANSACTIONS
仅显示活动事务,因此回滚事务不会显示在该虚拟 table。