2019年Oracle公司发布提示 10g版本数据库与高版本数据库之间的dblink可能会由于SCN增长频率不一致导致报错的问题,最近在我运维的项目中出现了这种问题,联系公司集成将老版本的数据库迁移到12c版本之后发现程序调用存储过程时出现报错 ORA-04091 表 发生了变化, 触发器/函数不能读它的问题。
在网上查询之后很多结论是由于触发器的问题导致,但是检查数据库中相关的表并没有关联触发器,排除这个原因,所以怀疑是存储过程中的函数引起。
后来偶然看到一个blog提到在触发器中增加以下代码实现事务自治排除问题,于是尝试了一下:
解决方法:
在相关的函数中也增加以下代码之后重新编译存储过程并测试发现问题已解决。
PRAGMA AUTONOMOUS_TRANSACTION
当前的触发器/函数作为已有事务的子事务运行,子事务自治管理,子事务的commit、rollback操作不影响父事务的状态。
目前暂时还不清楚问题原因以及是否会产生数据不一致的问题。