简单的交易很容易,但复杂的工作并不清楚。
假设我们有一些具有某种关系的模型,例如让我们User
和Account
,Controller
我们验证User
有足够的余额和他的{{1}也是有效的。在该步骤中,我们可以使用悲观锁定来查询记录,但是它没有帮助,因为我们在收到数据后立即释放锁定。
这些验证需要一些时间,然后我们实际上开始工作,查询远程API并执行复杂的计算,无论如何......当一切都在进行中时,我们仍然需要锁定用户和帐户模型。
这就是问题,锁定记录的最佳方法是什么,如果在Controller中添加互斥锁来覆盖验证和工作?或者在使用悲观锁定再次获取模型时在打开事务中进行另一次验证?或者也许是我错过的另一种方式?
伪代码
Account
def bet
bet = Bet.new bet_params
if bet.valid?
BetService.make_bet(bet) #do actual work, and
end
end
class Bet
# some code
validate :balance # self.user.lock!.balance > X
end
答案 0 :(得分:0)
如果我的问题正确,您可以使用ActiveRecord交易:
ActiveRecord::Base.transaction do
# all queries in here are in a single SQL transaction
end
答案 1 :(得分:0)
如果有很长的延迟,我会说要使用乐观的锁。如果没有延迟,那么悲观锁定会更好。
如果您需要使用本地验证的某些数据更新远程API中的信息,我会说使用悲观锁定。