有人告诉我,当从ADO.net调用Oracle时,在循环中调用多个插入时,每个插入都会触发一个触发器,包括在其PL-Sql中的一个提交语句,它是不可能停止该提交的实际上是在提交交易.
即,我希望我的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),那么它只能提交它(触发器)所做的任何更改.
触发器在触发器之外执行的工作没有任何危险.
注意:在某些情况下,在触发器中使用自治事务是危险的,因为即使触发语句被回滚,也会提交由自治触发器执行的操作.如果误用,这很容易导致数据损坏.