Oracle 触发器调用带commit的存储过程

触发器调用带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会检测此类死锁并返回错误信息。(自治事务较常见应用与事务日志。)

猜你喜欢

转载自bono2008202502.iteye.com/blog/2019873
今日推荐