2015-03-25 4 views
0

Я запускаю тонны фоновых заданий и продолжаю работать в состоянии гонки на одной конкретной задаче.MongoDB: Установить уровень сбора пессимистического замка

Rails 4, Mongoid, Sidekiq, Redis

Профиль has_many ProfilePictures

Когда этот код вызывается несколькими потоками

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 документов выбранного набора к истине.

То, что я хотел бы сделать, это установить пессимистическую блокировку на набор документов ProfilePicture, которые удовлетворяют профилю profile_id == self.profile_id или, по крайней мере, в коллекции ProfilePicture.

Я ничего не могу найти о встроенной блокировке для Mongoid или Mongo, поэтому я посмотрел на некоторые драгоценные камни.

Я добавил afeld/mongoid-locker, но это работает только на экземплярах одной модели. Я попытался добавить оба trakio/mongo-lock и servio/mongo-locking, но не мог понять, как использовать mongo-lock (что делает ссылка «my_key»?) И mongo-locking дает мне исходную ошибку для Active_Support 3.0. 4

Как разместить пессимистическую блокировку в наборе документов ProfilePicture, принадлежащих к определенному профилю?

+0

Вы работаете в классической проблеме mongodb - если ее можно избавиться от нее как можно скорее - хорошо читает: http://developer.olery.com/blog/goodbye-mongodb-hello-postgresql/ - https: // hn.algolia.com/?query=mongo&sort=byPopularity&prefix&page=0&dateRange=all&type=story – marvwhere

+0

Ха-ха, вы говорите, что это классическая проблема монгодба? Отлично, еще одна причина, по которой я ненавижу манго. Я хотел бы переключиться на что-то вроде postgres, но, к сожалению, это не мое решение. – cvgw

ответ

0

Для тех, кто заботится, я смог обойти эту проблему, удалив выбранный атрибут из модели profile_picture и вместо этого добавив атрибут selected_pic_id в модель профиля. Это позволило мне атомно обновить модель профиля, а не пытаться обновить коллекцию документов profile_picture.

Смежные вопросы