关于oracle 触发器,与事务回滚

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle 触发器,与事务回滚相关的知识,希望对你有一定的参考价值。

a表有个触发器
create or replace trigger trig_a
before update on a
for each row
trig_a往a_log表中插记录
我update a表后,rollback了,那trig_a中的插入a_log表的记录会不和回滚?
我就是想问下,触发器会提交事务马?触发器是不是不能自行提交事务的?
我对a表的update操作,我是没有commit过的

触发器的触发会被当成触发表操作的一个嵌套事务.
oracle不允许在触发器里使用commit,ROLLBACK操作,除非使用自治事务.
参考技术A 没有commit就没有提交到数据库,会回滚记录。提交了就不行了1 参考技术B 会的,

ORACLE 回滚和触发

【中文标题】ORACLE 回滚和触发【英文标题】:ORACLE Rollback and Trigger 【发布时间】:2010-11-09 10:29:27 【问题描述】:

如果有回滚,更新后触发器是否会启动?

场景:假设我们更新了表 A,表 A 上的触发器启动并使用详细信息更新另一个表 B。如果由于某些处理错误在表 A 上发出回滚,触发器是否会导致表 B 回滚更改?

【问题讨论】:

【参考方案1】:

是的,会的。

触发器在DML 语句的事务范围内工作(由您显式启动或由DML 语句本身隐式启动)

当此事务回滚时,触发器所做的所有更改也会回滚。

但是,如果你把

PRAGMA autonomous_transaction

在触发器定义中,触发器将启动自己的事务,您应该在触发器完成之前提交该事务。

【讨论】:

因此,如果您想记录所有 ATTEMPTS 以执行更新(即使它们失败或回滚),那么自治事务是好的,但如果您只想在触发更新时执行触发的操作,则不好成功并承诺。当心! 您需要明确的 COMMIT 来进行自主事务。如果不这样做,它将失败并显示“ORA-06519:检测到活动的自主事务并回滚”【参考方案2】:

请注意 - 如果您定义 AFTER UPDATE 语句级别触发器(没有 FOR EACH ROW 子句),如果表上的 DML 语句失败并回滚,它将不会触发。

【讨论】:

以上是关于关于oracle 触发器,与事务回滚的主要内容,如果未能解决你的问题,请参考以下文章

Oracle与SQL自治事务

Oracle的自治事务

触发器事件事务函数

TSQL:触发/回滚事务错误

mybatis 手动/自动触发事务回滚

(转)spring异常抛出触发事务回滚策略