【问题标题】:Scope of Oracle transactions when used from ADO.NET and involving triggers?从 ADO.NET 使用并涉及触发器时的 Oracle 事务范围?
【发布时间】:2010-09-21 03:20:15
【问题描述】:

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

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

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

这是正确的吗?

【问题讨论】:

  • 等等,在 SQL Server 中究竟有什么可能?自主Txns?在触发器中提交?
  • 在 SQL Server 中,每个 Begin Transaction 都会增加一个计数器,可以使用名为 @@TranCount 的内置事务范围变量来访问该计数器。然后每个 Commit Transactiopn 语句将其递减,并且 DB 仅在 @TranCount = 0 时才实际提交...
  • 来自 SQL Server Docs:BEGIN TRANSACTION 语句将 @@TRANCOUNT 递增 1。ROLLBACK TRANSACTION 将 @@TRANCOUNT 递减为 0,但 ROLLBACK TRANSACTION savepoint_name 除外,它不会影响 @@TRANCOUNT。 COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 减 1。

标签: oracle ado.net transactions triggers


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我发现了。再说一次,我想做的是禁止触发器提交,直到我的 ADO.Net 客户端代码从外部告诉数据库提交。然后我希望数据库提交所有待处理的操作,因为我在循环开始时开始事务,包括所有触发操作
  • Charles,你想要的正是将要发生的事情,除非触发器是自主的。如果它们是自主的,那么您无法控制它们何时被提交,并且可能有人这样做是有原因的。
  • 那么您的触发器是否包含 COMMIT 和 PRAGMA AUTONOMOUS_TRANSACTION?如果是这样,为什么你不想要它?!
  • 您不能停止或延迟自主事务......毕竟,它是自主的。无论调用 txn 是什么,它都会发生。
  • 托尼,如果可以的话,我会编辑这个,但你不是指 Oracle 数据库触发器,你是指 TABLE 触发器。我认为数据库触发器可以包括提交。
猜你喜欢
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 2018-08-14
  • 2020-10-22
  • 1970-01-01
  • 2012-08-29
  • 2019-03-13
相关资源
最近更新 更多