在Rails中锁定记录以进行处理的最佳方法是什么?

时间:2014-01-22 17:26:54

标签: mysql ruby-on-rails ruby locking

简单的交易很容易,但复杂的工作并不清楚。

假设我们有一些具有某种关系的模型,例如让我们UserAccountController我们验证User有足够的余额和他的{{1}也是有效的。在该步骤中,我们可以使用悲观锁定来查询记录,但是它没有帮助,因为我们在收到数据后立即释放锁定。

这些验证需要一些时间,然后我们实际上开始工作,查询远程API并执行复杂的计算,无论如何......当一切都在进行中时,我们仍然需要锁定用户和帐户模型。

这就是问题,锁定记录的最佳方法是什么,如果在Controller中添加互斥锁来覆盖验证和工作?或者在使用悲观锁定再次获取模型时在打开事务中进行另一次验证?或者也许是我错过的另一种方式?

伪代码

index_controller.rb

Account

bet.rb

def bet
  bet = Bet.new bet_params

  if bet.valid?
    BetService.make_bet(bet) #do actual work, and
  end
end

bet_service.rb

class Bet
  # some code
  validate :balance # self.user.lock!.balance > X
end

2 个答案:

答案 0 :(得分:0)

如果我的问题正确,您可以使用ActiveRecord交易:

ActiveRecord::Base.transaction do
  # all queries in here are in a single SQL transaction
end

答案 1 :(得分:0)

如果有很长的延迟,我会说要使用乐观的锁。如果没有延迟,那么悲观锁定会更好。

如果您需要使用本地验证的某些数据更新远程API中的信息,我会说使用悲观锁定。