突变表错误的原因和解决方案是什么?


12

我了解突变表错误是由设计缺陷或有问题的查询引起的。

最近将一个旧查询投入生产,该查询引发了变异表错误。我们的DBA解决了问题,但我们不知道如何解决。

究竟是什么导致表突变错误?我们的DBA如何解决该问题?

Answers:


17

导致表格错误的最可能原因是触发器的滥用。这是一个典型的例子:

  1. 您在表A中插入一行
  2. 表A上的触发器(针对每一行)对表A执行查询,例如以计算汇总列
  3. Oracle抛出ORA-04091:表A正在变异,触发器/函数可能看不到它

这是正常现象,这是正常现象,由于Oracle保证:

  • (i)每个陈述都是原子的(即失败或完全成功)
  • (ii)每个语句都看到一致的数据视图

编写此类触发器时,最有可能希望查询(2)看到插入(1)的行。由于更新尚未完成(可能要插入更多行),因此这与以上两点都矛盾。

Oracle 可以返回与语句开始之前的时间点一致的结果,但是从我看到的大多数尝试实现该逻辑的示例中,人们将多行语句视为一系列连续步骤的一部分,并且期望语句[2],以查看先前步骤所做的更改。Oracle无法返回预期结果,因此会引发错误。

进一步的阅读:Ask Tom上的“ muting table”

如果我怀疑突变表错误的原因是触发器,则避免该错误的一种方法是将逻辑从触发器移到过程中。


9

一个变异表时的声明导致触发器触发和触发器引用导致触发器表中出现。避免此类问题的最佳方法是不使用触发器,但我怀疑DBA没有花时间去做。他本可以执行以下任一操作:


1
至少对我来说,在11.2.0.4.0上更改为事后触发失败
软件先知

也对我来说 版本12.1.0.2.0,并且AFTER不起作用。
eidylon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.