Допустим, есть 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
не обновляется, а обновляются только его комментарии.Пожалуйста, объясните, есть ли другой простой способ сделать это.Заранее спасибо.