触发器调用带commit的存储过程会报错。
1、解决办法:在触发器里面加自治事务
CREATE OR REPLACE TRIGGER TRIGGER_NAME
AFTER INSERT OR UPDATE OR DELETE OF xxx ON TABLE_NAME
declare
PRAGMA AUTONOMOUS_TRANSACTION; --自治事务
BEGIN
PROCEDURE_NAME(XXX,XXX……);
commit;
END;
2、
自治事务:
一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的事务的影响。
如果session从B事务开始——A事务开始和结束——B事务结束
上述的A事务不受没有完成的B事务的影响,然后A事务执行完毕后再次回到B事务执行没有完成的B事务。
通过pragma autonomous_transaction将一个pl/sql程序结构设定为自治事务,pragma是编译器指令,可以将procedure function package等顶级匿名块定义成自治的程序结构。
自治事务允许你离开调用的事务上下文,执行一个独立的事务,然后返回调用的事务而不会影响到调用事务的状态。自治事务和调用事务不同,只有提交的事务才会在事务见共享。
自治事务与被调用事务完全独立,不能共享调用者事务使用的锁和其他资源,而且自治事务内还可以调用其他自治事务。
自治事务与其调用者可能会发生死锁,oracle会检测此类死锁并返回错误信息。(自治事务较常见应用与事务日志。)
本文探讨了在触发器中使用自治事务来解决调用带commit的存储过程时出现的错误问题。通过在触发器内部加入自治事务指令,确保了程序在独立事务环境中运行,避免了与外部事务的冲突,从而成功地解决了报错情况。
4054

被折叠的 条评论
为什么被折叠?



