oracle - 从 ADO.NET 使用并涉及触发器时 Oracle 事务的范围?

标签 oracle ado.net transactions triggers

有人告诉我,当从 ADO.net 调用 Oracle 时,当在循环中调用多个插入时,每个插入都会导致触发触发器,其中包含在其 PL-Sql 中的 Commit 语句,这是不可能停止的从实际提交事务开始提交。

即,我希望我的 ADO.Net 代码在循环开始之前开始事务,并且当循环退出时,仅当且仅当循环中的每个插入都成功时才提交所有插入。我的消息来源告诉我,Oracle 的工作方式,如果这些触发器包含 COmmit 语句,那么这是不可能的..

由于这似乎是一个非常常见的要求,而且我知道这在 SQL Server 中是可能的,所以这对我来说似乎不合适。

这是正确的吗?

最佳答案

如果你的线人谈论的是 Oracle 数据库触发器,那么他就错了:

1) 您不能将 COMMIT 放入非自治的 Oracle 触发器中:

SQL> create trigger this_wont_work
  2  after insert on emp
  3  begin
  4    commit;
  5  end;
  6  /

Trigger created.

SQL> insert into emp (empno) values (123)
  2  /
insert into emp (empno) values (123)
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "TONY.THIS_WONT_WORK", line 2
ORA-04088: error during execution of trigger 'TONY.THIS_WONT_WORK'

2) 如果触发器是自主的(即在其声明部分中有 PRAGMA AUTONOMOUS_TRANSACTION),那么它只能提交它(触发器)所做的任何更改。

触发器提交您在该触发器之外所做的工作不会有任何危险。

注意:除了某些情况外,在触发器中使用自治事务是危险的,因为即使回滚触发语句,自治触发器执行的操作也会被提交。如果使用不当,很容易导致数据损坏。

关于oracle - 从 ADO.NET 使用并涉及触发器时 Oracle 事务的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269570/

相关文章:

c# - 使用多线程的 SQL Server 数据库更新

c# - 我可以在读取过程中中断数据读取器吗?

c# - 我怎样才能实现一个知道 TransactionScope 的类?

java - 由于 Java SimpleDateFormat 问题,在 Oracle DB 中保存时间数据(带区域)无法正常工作

sql - PL/SQL - 在 FOR IN LOOP 中删除当前记录

mysql - 更改已关闭(但未解除分配)CURSOR 的 SELECT

database - 阳光场景下依赖db事务回滚

c - 尝试在 AIX 中动态加载 Oracle 客户端库时出错

entity-framework - vs2010中找不到ADO.NET实体模型浏览器窗口

android - 在事务中使用多个方法