我正在努力调试一些东西。
我们有大量的原始表,其中电子商务数据被大量添加。 我们有通过用户从我们的 UI 查询时使用的插入、更新和删除触发器填充的汇总表。
因此,这两个表应该“匹配”,也就是说,例如,如果原始表中的 SUM(revenue) 是 1,234,567 美元,那么汇总表中的 SUM(revenue) 应该相同。
这是有效的,并且已经工作了很长时间,但我们发现了看似完全不相关的实例,其中表格突然不匹配。在原始表中,我们将拥有汇总表中未考虑的数据。这个问题是不可重现的——如果我们删除原始数据和摘要数据并重新添加,一切都会很好地填充。该问题似乎还影响同一数据集中的任意数据 block 。例如,周一至周三一切正常,周四一团糟,周五之后又一切正常。
我几乎可以肯定未按预期工作的触发器是插入后触发器。我们维护所有数据的创建和更新时间,有问题的行未更新。
我也知道(或者我认为我知道)如果触发器失败,整个插入将失败并回滚。
共享触发器和细节会很快变得复杂。我只是想看看是否有人可以帮助激发头脑 Storm 过程。我想知道的是:
- 有没有人遇到过类似的事情?
- 是否存在我不知道可以将行插入到表中的什么位置的可能情况,触发器可能会失败,但该行仍会在表中?
- 触发器是否存在任何可能相关的常见错误?
我完全不知道如何调试...
最佳答案
Has anyone encountered something similar?
是的,我从不依赖仅触发器解决方案来保持汇总表同步。尽管理论上它应该有效,但很少能长期有效。基于触发器的系统非常棘手,以至于我最终没有经常使用它们。
Is there a possible situation I don't know of where a row could be inserted into a table, a trigger could fail, but that row would still be in the table?
有一些故意“处理”SQLEXCEPTION 的方法,可能会导致触发器在应该失败的地方继续执行。我从来没有这样做过,所以我没有例子。
类比在 Java 中,如果您在 catch()
block 中编写代码以“吃掉异常”,但不做任何事情来修复条件或报告它。
很明显,如果你做过它就会知道,因为 the syntax is pretty arcane而且你必须努力去做。
除此之外,我不知道触发器失败的任何情况,但生成触发器的 SQL 操作成功。
Are there any common mistakes with triggers that could be related?
想到的一种情况是,如果您在触发器主体中有复杂的条件逻辑,并且该逻辑未涵盖某些情况。所以它没有完成您期望的工作。
另一个常见的错误是触发器确实正常工作,但随后某些客户端直接更新了汇总表,并弄乱了汇总中的值。
或者竞争条件导致不同客户端同时更新汇总表,用不完整的计算覆盖彼此的工作。
关于mysql - MySQL 触发器可能会静默失败吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65259000/