插入触发器是否需要提交语句
Does an insert trigger need a commit statement
这是对实际场景的简化; Table B.
上缺少的记录在哪里?
假设有两个 db tables A ; B.
Table A 上有一个插入触发器;它对 Table B 执行插入操作(但它没有 COMMIT;)。
如果我们通过 JDBC 连接器打开数据库连接;并在 Table A 上插入;并提交;
触发器的行为是什么?它会自动提交 table B 上的插入语句吗?
触发器所做的任何更改都与触发触发器的事务一起提交。
所以是的,触发器内完成的更改将被提交 "automatically"。
您无论如何都不能在触发器内提交。
不仅触发器不需要 COMMIT,而且您不能将其放入:如果正文代码包含 COMMIT(或回滚),则触发器将无法编译。
这是因为触发器在交易期间触发。当触发器触发时,当前事务仍未完成。当 COMMIT 终止事务时,允许它们进入触发器会破坏工作单元。
因此,在触发器中执行的更改由发出触发触发器的 DML 的所属事务提交(或回滚)。
触发器确实可以 运行 在 PRAGMA AUTONOMOUS_TRANSACTION 下,在这种情况下它们必须有一个 COMMIT。但这是一个边缘案例,因为在 Oracle 中嵌套事务的有意义的用途很少。
触发器不应该提交也不能提交。在触发器中提交通常会引发异常,除非它发生在自治事务中。
当您打开连接时,Oracle 会为其创建会话。当您开始修改数据(插入 TableA)时,Oracle 开始事务。 TableA 上的触发器适用于同一会话和事务;对 TableB 的插入属于此事务。当您提交时,它会提交两个插入。
这是对实际场景的简化; Table B.
上缺少的记录在哪里?假设有两个 db tables A ; B.
Table A 上有一个插入触发器;它对 Table B 执行插入操作(但它没有 COMMIT;)。 如果我们通过 JDBC 连接器打开数据库连接;并在 Table A 上插入;并提交; 触发器的行为是什么?它会自动提交 table B 上的插入语句吗?
触发器所做的任何更改都与触发触发器的事务一起提交。
所以是的,触发器内完成的更改将被提交 "automatically"。
您无论如何都不能在触发器内提交。
不仅触发器不需要 COMMIT,而且您不能将其放入:如果正文代码包含 COMMIT(或回滚),则触发器将无法编译。
这是因为触发器在交易期间触发。当触发器触发时,当前事务仍未完成。当 COMMIT 终止事务时,允许它们进入触发器会破坏工作单元。
因此,在触发器中执行的更改由发出触发触发器的 DML 的所属事务提交(或回滚)。
触发器确实可以 运行 在 PRAGMA AUTONOMOUS_TRANSACTION 下,在这种情况下它们必须有一个 COMMIT。但这是一个边缘案例,因为在 Oracle 中嵌套事务的有意义的用途很少。
触发器不应该提交也不能提交。在触发器中提交通常会引发异常,除非它发生在自治事务中。
当您打开连接时,Oracle 会为其创建会话。当您开始修改数据(插入 TableA)时,Oracle 开始事务。 TableA 上的触发器适用于同一会话和事务;对 TableB 的插入属于此事务。当您提交时,它会提交两个插入。