它会处理两个人更新问题吗?
我用谷歌搜索并查看了 api 但什么也没找到
Rails 3+,红宝石 1.9.3
它会处理两个人更新问题吗?
我用谷歌搜索并查看了 api 但什么也没找到
Rails 3+,红宝石 1.9.3
使用 counter_cache 时,记录插入和计数器更新在同一个事务中完成。但这并不能保证操作的原子性。除了避免两个人更新问题之外,您可能还必须“锁定”您的记录。
请参阅这篇出色的文章。这是关于 redis-objects gem,但前两部分完美地解释了 ActiveRecord 的问题和解决方案。
简短的回答:没有。正如 Cédric 所提到的,Rails 会更新counter_cache
事务的内部,因此如果您说有一个更新同一记录的后台进程,您会发现自己遇到死锁错误,除非您使用with_lock
记录上的块运行这两个更新。
至少对于 Rails 5.x,给定的答案似乎并不正确,因为它将执行原子的 SQL UPDATE。
UPDATE .... SET counter = counter + 1