gpt4 book ai didi

ruby-on-rails - 如何避免 Rails 中的简单竞争条件?

转载 作者:行者123 更新时间:2023-11-29 11:55:38 25 4
gpt4 key购买 nike

我有一个简单的竞争条件。我有一个网站,人们可以在其中对照片进行投票,但最多允许投 10 票。

当用户提交投票时,我会更新照片表中该特定照片的 num_votes 列。我这样做是为了方便查找票数。

如何确保 vote.save 和 num_votes 更新发生在同一个事务中?

谢谢!

最佳答案

为了实现这一点,您必须使用某种锁定。基本上你有 3 个选项:乐观/悲观的 rails 锁定和一些外部锁定后端(如 Redis::Lock)。

如果高性能不是真正的情况,我个人会选择悲观锁定

photo = Photo.find(photo_id)
photo.with_lock do
photo.num_votes += 1
photo.save!
end

我还应该指出,坚持只包装递增的 num_votes 并保存到一个事务中不会解决竞争条件。大多数 RDBMS 默认工作在读提交模式。这并不能阻止这种竞争条件。

仅供引用 PessimisticOptimistic锁定引用

关于ruby-on-rails - 如何避免 Rails 中的简单竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13826428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com