Ruby:悲观主义者锁(self.lock!)是否可以使用update_all起作用?

时间:2018-10-12 09:44:31

标签: ruby-on-rails ruby ruby-on-rails-3 race-condition

我不想使用save!方法,悲观主义者锁(self.lock!)是否可以使用update_all方法工作?

lock!使用save!方法。

Account.transaction do
  self.lock!
  account1 = Account.find(...)
  account1.balance -= 100
  account1.save!
end

lock!使用update_all方法。

Account.transaction do
  self.lock!
  attributes["balance"] = recalculate_balance
  Account.where(:id => self.id).update_all(attributes)
end

Rails::VERSION::STRING => "3.2.22.4"

1 个答案:

答案 0 :(得分:1)

是的,update_all也释放了锁定。

但是:在您提供的代码中,您将行锁定在事务中。它不会释放此锁,因为事务无论如何都锁定该行。它将与事务提交一起发布。