Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 验证中的ActiveRecord竞争条件_Ruby On Rails_Activerecord_Concurrency - Fatal编程技术网

Ruby on rails 验证中的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

我想澄清一些关于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(:song, "Cannot update beats while beat is being sold.") if !self.purchases.empty?
  end
end
class-Purchase
现在让我们假设我有一个现有的歌曲实例,并尝试更新它。这里不是有比赛条件吗?具体而言:

  • 运行歌曲验证,一切都通过
  • 为歌曲创建购买并保存到db
  • 将歌曲保存到数据库
  • 我怎样才能防止这种情况发生?我不知道如何在这种情况下使用锁,因为购买是一个有很多


    谢谢

    购买会影响购买模式,歌曲更新会影响歌曲模式。
    由于ActiveRecord将这些模型映射到数据库中的单独表,因此单独访问它们时不涉及“竞争条件”

    然而,我看到如果你删除一首歌,任何购买都会抛出错误。 针对该场景,而不是更新场景


    此外,但这应该是标准的,不要更新歌曲的主键。

    什么是“竞争条件”?竞争条件是两个过程分别发生的情况,“竞争条件”会导致无法预测的结果,因为你不知道哪一个会先发生。我不认为这是一个比赛条件的例子,但是,不能购买这首歌后,歌曲验证通过,之前,歌曲在数据库中实际更新?具体来说,self.purchases的值在验证检查中调用后可以更改。对吗?事实上是的,你是对的:如果你有两个独立的rails进程在运行,每个进程都访问同一个数据库(你可能在服务器上有),那么一个对象在被验证和保存之间可能会变得无效。我肯定你知道你的“如果被出售就不能更新”情况更像是这样“如果您曾经被出售过,则无法更新”,顺便说一句:)