这是一个非常奇怪的错误,有时会发生在我们的生产环境中。我使用一个非常简单的聚合(MAX)查询来确定表中给定列的最大值:
last_uid = SomeEntity.objects.all().aggregate(Max('uid_mail'))['uid_mail__max'] or 0
问题是在极少数情况下,此查询返回的值不正确。它在3年内发生了3到4次,总是带来相当严重的后果(例如,昨天它返回22而不是1722,导致我们的托管服务提供商暂停我们的网站,因为此错误导致发送了大量邮件)
发出的SQL查询很简单: DEBUG util(0.002)SELECT MAX(finanzas_enviosiirecibido.uid_mail)AS uid_mail__max FROM finanzas_enviosiirecibido; ARGS =()
我绝对肯定返回的值不正确:我们记录了从这个查询中获得的值,这些是我们得到的值:
2014-06-13 03:34:06:
DEBUG siidte lastUid:1721
2014-06-14 05:39:29(第二天):
DEBUG siidte lastUid:22
我也绝对确定值为>的行在此期间没有删除22个(事实上,在最后一次运行之后,每个uid值有两行而不是一行 - 该uid列没有唯一性约束,但我在先前的备份中验证了每个uid只有一行。
所以我怀疑在Django和裸机之间的堆栈中有一个错误,但我不知道在哪里。这是设置:
Django 1.5.1 Python 2.7.3 数据库:MySQL 5.5(5.5.22-0ubuntu1) 操作系统:在KVM虚拟机中运行的Ubuntu 12.04.4 LTS(x86)。 物理服务器本身可能无关紧要,因为VM在两个不同的服务器(一个Intel Xeon和一个Core i5)上发生了问题。
有人经历过类似的事吗?并找到了解决方案?