账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    oracle触发器执行时报ORA-04091和ORA-00060错误
    37
    0

    场景:业务层面删除(物理删除)表A数据的某条数据时,将该条数据插入B表。

    在A表上建立了触发器

    CREATE OR REPLACE TRIGGER cmsinfo
    AFTER delete
    ON tablea
    for each row
    BEGIN
    IF DELETING THEN
           INSERT INTO tableb values(:old.id);
    end if;
    END cmsinfo ;

    这是执行删除的话会报ORA-04091错误

    ORA-04091: 表 tablea 发生了变化, 触发器/函数不能读它

    网络上找了一下说是要自治事物,修改触发器如下后,依然报错

    CREATE OR REPLACE TRIGGER cmsinfo
    AFTER delete
    ON tablea
    for each row
    declare
        pragma autonomous_transaction;
    BEGIN
    IF DELETING THEN
           INSERT INTO tableb values(:old.id);
           COMMIT;
    end if;
    END cmsinfo ;

    执行删除后报错如下

    nested exception is java.sql.SQLException: ORA-00060: 等待资源时检测到死锁

    如何在不修改也代码的情况下,完成此需求(删除(物理删除)表A数据的某条数据时,将该条数据插入B表)。

    因为项目不是我们自己的不太好修改,想从数据库层面实现。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ORA-04091 和 ORA-00060 是Oracle数据库中两种不同的错误:

      1. ORA-04091: 表/视图触发器的父表正在被修改,无法读取该表。这是因为在同一个事务中,你试图在一个触发器内部查询或修改了相同的表,这违反了Oracle的“在同一层递归触发中不能直接或间接查询或修改表”的规则,即所谓的“ mutating table”问题。解决办法通常是通过使用 PL/SQL 集合类型、临时表或者在触发器外部处理相关逻辑。

      2. ORA-00060: 死锁检测到,事务被回滚。这个错误是因为两个或多个会话相互等待对方释放资源,形成了死锁。例如,会话A锁住了会话B需要的资源,同时会话B也锁住了会话A需要的资源,这样就导致了死锁。在触发器执行过程中,如果涉及到多表操作且存在并发访问,可能会出现这种情况。解决方案通常包括优化SQL语句和事务处理逻辑以减少锁定资源的时间,按照一致的顺序访问表等。

      对于上述两种错误,在触发器的设计与实现时需要特别注意并发控制、事务管理和资源锁定等问题。如果触发器的功能较为复杂,可能需要结合业务逻辑进行更深入的分析和重构。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部