0

与えられたユーザー モデルとトランザクション モデル:

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 つの質問ですが、たとえば親モデルを更新しながらリレーション モデルを更新する必要がある場合など、ネスティング ロックを使用するのは良い方法ですか?

4

1 に答える 1