Есть ли функция сохранения и блокировки для ассоциаций в Rails, чтобы избежать проблем параллелизма? - PullRequest
0 голосов
/ 02 мая 2019

Допустим, есть ActiveRecord 'Post' и в нем много комментариев.Я использую: autosave => true в объявлении has_many в post.rb.Я также использую функцию оптимистичной блокировки Rails для Post.Теперь рассмотрим следующую ситуацию:

p = Post.find(1)
p.comments.update_all(status: 'inactive')
p.comments.build([{data: "something1"}, {data: "something2"}])
p.save!

Из-за функции автосохранения я предполагаю, что вся транзакция является атомарной, т. Е. Строка p.save! создает два комментария для сообщения p.

Теперь возникает следующая проблема, когда две машины / потоки работают параллельно.

Событие 1 : Machine1 p = Post.find(1)

Событие 2 :Machine2 p = Post.find(1)

Событие 3 : Machine1 p.comments.update_all(status: 'inactive')

Событие 4 : Machine2 p.comments.update_all(status: 'inactive')

Событие 5 : Machine1 p.comments.build([{data: "something1"}, {data: "something2"}])

Событие 6 : Machine2 p.comments.build([{data: "something1"}, {data: "something2"}])

Событие 7 : Machine1 p.save!

Событие 8 : Machine2 p.save!

В идеале, когда это происходит последовательно, у нас остаются 2 неактивных комментария.Но из-за какой-то сложной настройки у нас это работает параллельно, и вместо этого создаются 4 комментария.

Итак, как этого избежать?

Я также использую функцию оптимистической блокировки для активной записи, котораявыдает ошибку устаревшего объекта.Но это не работает в случае, когда Post p не обновляется, а обновляются только его комментарии.Пожалуйста, объясните, есть ли другой простой способ сделать это.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...