MySQL 触发器可能会静默失败吗?

Possible for a MySQL trigger to silently fail?

我正在努力调试一些东西。

我们有大量原始 tables,其中电子商务数据被添加到高位。 我们有摘要 tables,它们是通过插入、更新和删除触发器填充的,当用户从我们的 UI.

查询时使用这些触发器

因此,这两个 tables 应该“匹配”,也就是说,例如,如果来自原始 tables 的 SUM(收入)是 1,234,567 美元,那么来自原始 tables 的 SUM(收入) summary table 应该是一样的。

这是有效的,并且已经工作了很长时间,但我们发现看似完全不相关的实例,其中 table 突然不匹配。在原始 table 中,我们将拥有未在摘要 table 中说明的数据。这个问题是不可重现的——如果我们删除原始数据和摘要数据并重新添加,一切都会很好地填充。该问题似乎还影响同一数据集中的任意数据块。比如星期一到星期三,一切都很好,星期四完全搞砸了,星期五开始又一切正常了。

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

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

共享触发器和细节会很快变得复杂。我只是想看看是否有人可以帮助激发头脑风暴过程。我想知道的是:

我完全不知道如何调试...

Has anyone encountered something similar?

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

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 的方法,可能会导致触发器在应该失败的地方继续运行。我从来没有这样做过,所以我没有例子。

如果您在 catch() 块中编写代码 “吃掉异常” 但不对解决问题或报告它。

很明显,如果你做过它就会知道,因为 the syntax is pretty arcane 而且你必须付出努力才能做到。

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

Are there any common mistakes with triggers that could be related?

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

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

或者竞争条件导致摘要 table 被不同的客户端同时更新,用不完整的计算覆盖彼此的工作。