我们正在尝试为我们的生产环境实施分片。我们面临的问题是我们推迟了一些工作,这些工作正在处理一些背景处理。如果我们更新模型并在延迟作业中为延迟作业添加一个条目,那么它将获取该对象的旧值并且它不一致。例如,用户模型具有名称,位置,如果我想在他改变位置时触发邮件,那就像
usr = User.find(1)
usr.position = "foo"
usr.save
在延迟作业中,如果我获取usr = User.find(1),它将获取旧值。我们在生产环境中使用乘客,mysql我们仍然在Rails 2.3.18上。在我们的应用程序操作中遇到同样的问题之前,我们已经停止使用它并且问题在我们的应用程序操作中解决了,这也是由mysql查询缓存中的错误导致的
答案 0 :(得分:0)
这看起来像一个缓存问题,有许多变通方法,在你继续前进并使整个缓存无效之前,这会影响性能,我建议你在使用该对象之前发出usr.reload
。
此致
答案 1 :(得分:0)
我能够确定与mysql可重复读取更多信息有关的问题 http://www.mysqlperformanceblog.com/2012/08/28/differences-between-read-committed-and-repeatable-read-transaction-isolation-levels/
在我们的延迟作业中,我们正在保存具有after_commit回调的对象。这使得事务处于打开状态(因为它无效)并且既不提交也不发布回滚。我检查了after_commit代码,它们将禁用回滚,只有在我的情况下有异常,它只是返回false而不抛出异常。