Ruby on rails 验证中的ActiveRecord竞争条件
我想澄清一些关于ActiveRecord的事情。假设我有这样一个场景:Ruby on rails 验证中的ActiveRecord竞争条件,ruby-on-rails,activerecord,concurrency,Ruby On Rails,Activerecord,Concurrency,我想澄清一些关于ActiveRecord的事情。假设我有这样一个场景: class Purchase < ActiveRecord::Base belongs_to :song end class Song < ActiveRecord::Base has_many :purchases validate :cannot_update_if_being_sold def cannot_update_if_being_sold errors.add(:son
class Purchase < ActiveRecord::Base
belongs_to :song
end
class Song < ActiveRecord::Base
has_many :purchases
validate :cannot_update_if_being_sold
def cannot_update_if_being_sold
errors.add(:song, "Cannot update beats while beat is being sold.") if !self.purchases.empty?
end
end
class-Purchase
现在让我们假设我有一个现有的歌曲实例,并尝试更新它。这里不是有比赛条件吗?具体而言:
谢谢 购买会影响购买模式,歌曲更新会影响歌曲模式。
由于ActiveRecord将这些模型映射到数据库中的单独表,因此单独访问它们时不涉及“竞争条件” 然而,我看到如果你删除一首歌,任何购买都会抛出错误。 针对该场景,而不是更新场景
此外,但这应该是标准的,不要更新歌曲的主键。什么是“竞争条件”?竞争条件是两个过程分别发生的情况,“竞争条件”会导致无法预测的结果,因为你不知道哪一个会先发生。我不认为这是一个比赛条件的例子,但是,不能购买这首歌后,歌曲验证通过,之前,歌曲在数据库中实际更新?具体来说,self.purchases的值在验证检查中调用后可以更改。对吗?事实上是的,你是对的:如果你有两个独立的rails进程在运行,每个进程都访问同一个数据库(你可能在服务器上有),那么一个对象在被验证和保存之间可能会变得无效。我肯定你知道你的“如果被出售就不能更新”情况更像是这样“如果您曾经被出售过,则无法更新”,顺便说一句:)