insert触发器是否需要commit语句

时间:2017-11-21 08:00:50

标签: oracle database-trigger

这是对实际场景的简化;哪里可以看到表B中缺少的记录。

假设有两个数据库表A;乙

表A上有一个插入触发器;它对表B进行插入(但它没有COMMIT;)。 如果我们通过JDBC连接器打开数据库连接;并在表A上插入;并承诺; Trigger的行为是什么?是否会自动在表B上提交insert语句?

3 个答案:

答案 0 :(得分:4)

触发器不仅不需要COMMIT,而且还可以放入一个:如果正文代码包含COMMIT(或回滚),则触发器不会编译。

这是因为在交易期间触发了火。当触发器触发时,当前事务仍未完成。当COMMIT终止一个允许它们进入触发器的事务会破坏工作单元。

因此,触发器中执行的更改由发出触发触发器的DML的拥有事务提交(或回滚)。

触发器可以在PRAGMA AUTONOMOUS_TRANSACTION下运行,在这种情况下,它们必须有一个COMMIT。但这是一个边缘情况,因为Oracle中嵌套事务的使用很少。

答案 1 :(得分:2)

触发器所做的任何更改都是通过触发触发器的事务提交的。

所以是的,在触发器内完成的更改将“自动”提交。

无论如何,你无法在触发器内部提交。

答案 2 :(得分:1)

触发器不应该提交也不能提交。在触发器中提交通常会引发异常,除非它发生在自治事务中。

当您打开连接时,Oracle会为其创建会话。当您开始修改数据(插入TableA)时,Oracle启动事务。 TableA上的触发器适用于同一会话&交易; insert into TableB属于此事务。提交时,它会提交两个插入内容。