Лучшее, что можно сделать - это выполнить свои операции в транзакции с БД. Поскольку у вас, вероятно, в конечном итоге будет запущено несколько приложений, и они, вероятно, не будут совместно использовать память, вы не сможете создать блокировку Mutex на уровне приложений, особенно если эти две службы приложений работают в совершенно разных физических блоках. Вот как выполнить транзакцию с БД:
ActiveRecord::Base.transaction do
# Transaction code goes here.
end
Если вы хотите обеспечить откат транзакции БД, вам нужно включить проверку для класса Bar, чтобы неправильный запрос на сохранение вызвал откат:
ActiveRecord::Base.transaction do
bar = Bar.new(params[:bar])
bar.save!
end
Если у вас уже есть объект bar в БД, вы можете пессимистически заблокировать этот объект следующим образом:
ActiveRecord::Base.transaction do
bar = Bar.find(1, :lock => true)
# perform operations on bar
end