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