【问题标题】:Does an insert trigger need a commit statement插入触发器是否需要提交语句
【发布时间】:2018-05-04 14:45:52
【问题描述】:

这是对实际场景的简化;在哪里查看表 B 上的缺失记录。

假设有两个数据库表 A ; B.

表 A 上有一个 on insert 触发器;它对表 B 执行插入操作(但它没有 COMMIT;)。 如果我们通过 JDBC 连接器打开一个 db 连接;并在表 A 上插入;并提交它; 触发器的行为是什么?它会自动提交表 B 上的插入语句吗?

【问题讨论】:

  • 您是否尝试添加提交?如果你这样做了,你会看到一个错误——这是不允许的(除非它是自主的)。
  • 我没有添加提交。想在此之前确认行为。

标签: oracle database-trigger


【解决方案1】:

触发器所做的任何更改都会与触发触发器的事务一起提交。

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

无论如何,您都不能在触发器内提交。

【讨论】:

    【解决方案2】:

    触发器不仅不需要 COMMIT,而且您不能将其放入:如果主体代码包含 COMMIT(或回滚),则触发器将无法编译。

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

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


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

    【讨论】:

      【解决方案3】:

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

      当您打开连接时,Oracle 会为其创建会话。当您开始修改数据(插入 TableA)时,Oracle 开始事务。 TableA 上的触发器适用于同一会话和事务;插入到 TableB 中的插入属于该事务。当您提交时,它会同时提交两个插入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-13
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        相关资源
        最近更新 更多