与えられたユーザー モデルとトランザクション モデル:
class User < ActiveRecord::Base
has_many :transactions
end
class Transaction < ActiveRecord::Base
belongs_to :user
end
この問題は、頻繁に呼び出される API で発生します。
def trx
User.transaction do
user = User.where(id: @data.user.id).lock(true).first
trx_number = user.transactions.count + 1
# some work
user.transactions.create(...)
change_balance = ...
user.balance = user.balance.to_f + change_balance.to_f
inform_user = user.has_valid_informee
if !result && inform_user
inform_user.balance = inform_user.aff_balance.to_f + @amount.to_f
inform_user.save!
end
user.save!
end
end
最初に、ちょうど を使用してユーザーの残高を更新すると競合状態になり、@data.user
前の前に新しいリクエストが終了する場合があるため、一部のデータが失われました。代わりに、そのユーザーのロックを要求し始めました。
次の競合状態は、総トランザクション数のカウントでした。今見たように、inform_user を持つ別の RC があります。
だから問題は、私が間違っているのですか?inform_user の更新バランスを次のように書き直すのは良い方法ですか?
inform_user.with_lock do
inform_user.balance = inform_user.aff_balance.to_f + @amount.to_f
end
もう 1 つの質問ですが、たとえば親モデルを更新しながらリレーション モデルを更新する必要がある場合など、ネスティング ロックを使用するのは良い方法ですか?