Ruby on rails MongoDB:设置集合级别悲观锁

Ruby on rails MongoDB:设置集合级别悲观锁,ruby-on-rails,mongodb,concurrency,mongoid,Ruby On Rails,Mongodb,Concurrency,Mongoid,我做了大量的后台工作,并且在一个特定的工作上一直处于竞争状态 Rails 4、Mongoid、Sidekiq、Redis 个人资料有很多个人资料图片 当多个线程调用此代码时 def set_as_active_picture ProfilePicture.where({ profile_id: self.profile.id, selected: true} ).update_all('$set' => {selected: false})

我做了大量的后台工作,并且在一个特定的工作上一直处于竞争状态

Rails 4、Mongoid、Sidekiq、Redis

个人资料有很多个人资料图片

当多个线程调用此代码时

  def set_as_active_picture
    ProfilePicture.where({
      profile_id: self.profile.id,
      selected: true}
    ).update_all('$set' => {selected: false})

    self.set selected: true

    self.profile.set(picture_url: self.image.url)
  end
我遇到了一个竞争条件,其中多个ProfilePicture文档已选择设置为true

我想做的是在满足profile_id==self.profile_id的一组ProfilePicture文档上或至少在ProfilePicture集合上设置一个悲观锁

我找不到任何关于Mongoid或Mongo的本机锁定的信息,所以我找了一些gems

我添加了afeld/mongoid locker,但这只适用于单个模型实例。我尝试添加trakio/mongo锁和servio/mongo锁,但不知道如何使用mongo锁“我的钥匙”指的是什么?mongo locking给了我一个Active_支持3.0.4的源错误


如何对属于特定配置文件文档的ProfilePicture文档集设置悲观锁定?

对于那些关心此问题的人,我可以通过从配置文件图片模型中删除所选属性,而不是向配置文件模型添加所选属性来解决此问题。这使我能够自动更新配置文件模型,而不是试图更新配置文件图片文档的集合。

您遇到了一个典型的mongodb问题-如果可能的话,请尽快解决它-很好地理解了这一点:-哈哈,您是说这是一个典型的mongodb问题?很好,这是我讨厌mongo的另一个原因。我很想转学博士后,但不幸的是,这不是我的决定。