Ruby on rails 您可以更新从memcached检索到的模型,还是必须重新蚀刻?

Ruby on rails 您可以更新从memcached检索到的模型,还是必须重新蚀刻?,ruby-on-rails,activerecord,memcached,Ruby On Rails,Activerecord,Memcached,活动记录是否存在过时数据的问题,或者它是否愿意执行更新 假设我将用户记录保存在memcached中,然后后台作业会更新同一个用户记录,因此memcached现在有一个旧版本的用户记录 现在在我的web应用程序中,我从memcached中获取用户记录,并更新一个属性然后保存它,它会因为用户记录不是最新的而引发异常吗?ActiveRecord的内部跟踪系统应该只更新自上次保存以来修改过的字段,因此,如果您更新了字段A,而后台作业更新了字段B,那么应该没有冲突 不过,在使用计数器时,您会遇到问题。如果

活动记录是否存在过时数据的问题,或者它是否愿意执行更新

假设我将用户记录保存在memcached中,然后后台作业会更新同一个用户记录,因此memcached现在有一个旧版本的用户记录


现在在我的web应用程序中,我从memcached中获取用户记录,并更新一个属性然后保存它,它会因为用户记录不是最新的而引发异常吗?

ActiveRecord的内部跟踪系统应该只更新自上次保存以来修改过的字段,因此,如果您更新了字段A,而后台作业更新了字段B,那么应该没有冲突

不过,在使用计数器时,您会遇到问题。如果您的计数器C缓存为10,但在后台作业之后实际上是12,并且您想再添加一个,那么您将保存11,而不是13。这就是为什么您永远不应该为计数器赋值,而是对其执行差分调整

这是错误的方式:

UPDATE things SET foo_count=11;
这是正确的方法:

UPDATE things SET foo_count=foo_count+1;
您可以使用ActiveRecord的方法来实现这一点


唯一的例外情况是,如果您使用的是ActiveRecord版本控制锁,但这似乎比它的价值更麻烦。

它不会引发异常。这与两个用户编辑同一条记录并在不同时间保存的情况相同。如果这是一种常见的情况,你必须处理它,就像你的案子一样。