ORACLE 自治事物
一、问题
(1)现象
一个表A,存在一个触发器,该触发器用来统计表A的数量,并将结果更新到B表。此时,java代码里面调用insert into select 语句,会发生ora-04091错误。
(2)分析
Java调用insert into A select from A语句,对于表A来说,同时查询和插入,这个时候,如果A有插入触发器,并统计A表的数量,就存在问题,因为有java事物和触发器事物两个事物存在,就会报错。这时,需要使用到自治事物。
二、ORACLE自治事物
除了以上问题,如果遇到这个问题:在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表。
有无方法解决?同样是自治事物。
AT 是由主事务(以下MT)调用但是独立于它的事务。在AT被调用执行时,MT被挂起,在AT内部,一系列的DML可以被执行并且commit或rollback.
注意由于AT的独立性,它的commit和rollback并不影响MT的执行效果。在AT执行结束后,主事务获得控制权,又可以继续执行了。
使用语法:
Declare
PRAGMAAUTONOMOUS_TRANSACTION;
.....
Commit;