我有一个应用程序不幸地使用带有 MyISAM 表的遗留 mysql_* 函数(bleagh ...),所以我不能使用事务。我有获取当前余额的代码,检查此余额是否正常,如果是,它将减去一个数量并保存新余额。
问题是,我最近看到一个实例,其中两个查询获取相同的起始余额,减去一个数量,然后记录一个新的余额。由于他们都获得了相同的起始余额,因此两次更新后的期末余额都是错误的。
100 - 10 = 90
100 - 15 = 85
什么时候应该...
100 - 10 = 90
90 - 15 = 75
这些请求相隔几分钟执行,所以我不认为差异是由于竞争条件造成的。我最初的想法是 MySQL 缓存正在存储相同的初始查询的结果,以获得平衡。但是,我读到如果修改了任何相关表,则会删除这种类型的缓存。
我很可能会通过将所有内容放入一个查询来解决,但我仍然想弄清楚这一点。它让我感到迷惑。如果在修改表时删除了缓存,那么发生的事情不应该发生。有没有人听说过这样的事情,或者对为什么会发生有任何想法?