firebird - 自主事务中的 Firebird 2.5 异常处理
问题描述
我在我们的一个 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 表中没有相关记录。
问题是,如果插入失败,自治事务会被回滚,还是“当任何时候”阻止回滚并且会有一个打开的事务?我可以只删除异常处理,因此它会自动回滚而不引发异常并阻塞其余代码吗?
解决方案
when any do
在自治事务块内部使用 a不会回滚事务,而是会在块结束后提交,因为异常不会逃脱块。
然而,这可能是想要的结果:在 Firebird 中提交事务(相对)比回滚便宜。事实上,如果一个事务在没有任何变化的情况下回滚,Firebird 无论如何都会将回滚转换为提交。
我不认为这是您的性能问题的原因,但是没有可重复的示例,很难对此进行推理。
顺便说一句,状态为 3 的事务被回滚,并且回滚的事务已经结束。MON$TRANSACTIONS
仅显示活动事务,因此回滚事务不会显示在该虚拟表中。
推荐阅读
- apache-spark - Spark管道的并行自动化测试
- cakephp - 我可以忽略 cakephp 与多个数据库的连接错误吗?
- entity-framework - 在 EF Core 中,如何执行分组并选择逗号分隔值列表?
- flutter - 如何:默认显示 video_player 插件的播放控件 (flutter-web)
- android - 尝试确定屏幕是否关闭时检测常亮显示
- unity3d - unity 清新 场景太暗
- django - 过滤外键下拉字段 Django
- date - Pyspark:如何在日期上创建窗口
- angular - 订阅 rxjs 中的超时
- makefile - 无法使用 Makefile 链接到 SFML 库,即使它作为一个衬垫工作