当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《从ADO.NET使用并涉及触发器时Oracle事务的范围?》经验,为你挑选了1个好方法。

有人告诉我,当从ADO.net调用Oracle时,在循环中调用多个插入时,每个插入都会触发一个触发器,包括在其PL-Sql中的一个提交语句,它是不可能停止该提交的实际上是在提交交易.

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

因为这似乎是一个非常普遍的要求,我知道在SQL Server中这是可能的,这对我来说似乎不对.

它是否正确?



1> Tony Andrews..:

如果他在讨论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),那么它只能提交它(触发器)所做的任何更改.

触发器在触发器之外执行的工作没有任何危险.

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有