Rails mysql获取旧值

Rails mysql获取旧值,mysql,ruby-on-rails,passenger,delayed-job,Mysql,Ruby On Rails,Passenger,Delayed Job,我们正在尝试为我们的生产环境实现分片。我们面临的问题是,我们延迟了处理一些后台处理的工作。如果我们更新一个模型并在延迟作业中放入一个条目,以便在延迟作业中进行处理,那么它将获取该对象的旧值,并且它是不一致的。例如,用户模型有name,position,如果我想在他改变位置时触发邮件,就像 usr = User.find(1) usr.position = "foo" usr.save 在延迟作业中,如果我获取usr=User.find(1),它将获取旧值。我们在生产环境中使用passenge

我们正在尝试为我们的生产环境实现分片。我们面临的问题是,我们延迟了处理一些后台处理的工作。如果我们更新一个模型并在延迟作业中放入一个条目,以便在延迟作业中进行处理,那么它将获取该对象的旧值,并且它是不一致的。例如,用户模型有name,position,如果我想在他改变位置时触发邮件,就像

usr = User.find(1)
usr.position = "foo"
usr.save 

在延迟作业中,如果我获取usr=User.find(1),它将获取旧值。我们在生产环境中使用passenger,mysql我们仍然使用Rails 2.3.18。在我们的应用程序操作中遇到同样的问题之前,它也是由mysql查询缓存中的一个错误引起的,我们停止使用该错误,并在我们的应用程序操作中解决了该问题。这看起来像一个缓存问题,在您继续并使整个缓存失效之前,有很多解决方法,这会影响性能,我建议您在使用对象之前发出一个
usr.reload


关于,

我能够确定与mysql可重复读取有关的问题更多信息


在延迟的作业中,我们保存了具有after_commit回调的对象。它使事务保持打开状态(因为它无效),并且既没有提交也没有发出回滚。我检查了after_commit代码,在那里他们将禁用回滚,并且只有在出现异常时才会这样做。在我的例子中,它只是返回false而没有抛出异常。

问题是在DB级别还是在Rails级别?我的意思是:如果您手动在DB上进行查询,您是否得到正确的答案?是的,如果我直接从DB控制台进行查询(与我从rails logger获得的查询相同),并且如果我再次运行相同的作业,则无法获取..保留此ActiveRecord::Base.connection.reset!就在加载之前,执行延迟作业修复了该问题。。我不确定它为什么会导致问题IDAVOD有时我们会从对象创建触发一些延迟的作业,即使在那里,它也根本没有获取保存的对象。在这种情况下,我不能使用重新加载,因为我将在“查找”中得到一个错误。我写了一个新的重置方法
def reset\u与用户一起更改!如果@connection.response\u to?(:change\u user)@connection.change\u user(@config[:username]、@config[:password]、@config[:database])end
我实际上删除了配置连接,该连接基本上设置了utf-8,并将SQL\u AUTO\u设置为\u NULL=0,工作正常。