2

有人告诉我,当从 ADO.net 调用 Oracle 时,当在循环中调用多个插入时,每个插入都会触发一个触发器,该触发器在其 PL-Sql 中包含一个 Commit 语句,因此无法停止该提交实际提交事务。

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

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

它是否正确?

4

1 回答 1

6

您的线人是错误的,如果他在谈论 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),那么它只能提交它(触发器)所做的任何更改。

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

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

于 2008-11-06T17:52:16.733 回答