MySQL触发器可能会静默失败



我正竭尽全力调试一些东西。

我们有大型的原始表格,电子商务数据会被添加到其中。我们有通过插入、更新和删除触发器填充的汇总表,这些触发器在用户从我们的UI查询时使用。

因此,这两张桌子应该"匹配";也就是说,例如,如果来自原始表的SUM(收入(是$123467,那么来自汇总表的SUM(收入(应该是相同的。

这是有效的,而且已经有效了很长一段时间,但我们发现了看似完全无关的情况,突然之间表格不匹配。在原始表中,我们将有汇总表中未考虑的数据。这个问题是不可复制的——如果我们删除原始和摘要数据并再次添加,那么所有内容都会填充得很好。这个问题似乎也会影响同一数据集中的任意数据块。例如,周一到周三,一切都很好,周四完全乱了,周五以后一切又好了。

我几乎可以肯定,没有按预期工作的触发器是插入后触发器。我们维护所有数据的创建和更新时间,有问题的行没有更新。

我也知道(或者我认为我知道(,如果触发器失败,整个插入将失败并回滚。

分享触发因素和细节会很快变得复杂起来。我只是想看看是否有人能帮助激发一个头脑风暴的过程。我想知道的是:

  • 有人遇到过类似的事情吗
  • 是否存在我不知道的情况,即行可以插入表中,触发器可能失败,但该行仍在表中
  • 触发器是否存在任何可能相关的常见错误

我只是完全不知道如何调试。。。

有人遇到过类似的事情吗?

是的,我从不依赖仅限触发器的解决方案来保持汇总表的同步。尽管它在理论上应该有效,但它很少能长期有效。基于触发器的系统非常棘手,以至于我最终不经常使用它们。

是否存在我不知道在哪里可以将行插入表中,触发器可能失败,但该行仍在表中的情况?

有一些方法可以故意"处理";SQLEXCEPTIONs,并且可能导致触发器在应该失败的地方继续。我从来没有这样做过,所以我没有一个例子。

如果您编写代码到";吃破例">catch()块中,但不采取任何措施来修复或报告该情况。

显然,如果你做过,你就会知道这一点,因为语法非常晦涩,你必须努力做到这一点

除此之外,我不知道有任何触发器失败的情况,但引发触发器的SQL操作成功了。

触发器是否存在任何可能相关的常见错误?

想到的是,如果触发器主体中有复杂的条件逻辑,并且该逻辑不涵盖某些情况。所以它没有完成你期望的工作。

另一个常见的错误是触发器确实工作正常,但随后一些客户端直接更新了汇总表,并弄乱了汇总中的值。

或者,竞争条件导致不同客户端同时更新汇总表,从而用不完整的计算覆盖彼此的工作。

最新更新