0

ペシミスト ロック (InnoDB を使用) について理解を深めるために、Rails アプリケーションで次のコードを実行してみました。

Thread.new do
  Account.transaction do
    account = Account.lock(true).first
    account.balance += 250
    account.save!
  end
end

Thread.new do
  Account.transaction do
    account = Account.lock(true).first
    account.balance += 500
    account.save!
  end
end

それは実際に機能し、次のヒットでをaccount.balance含みます。ロックしないと、最後のスレッドが考慮され、結果は.7501500500

ロックするかどうかの違いを試すためのばかげたテストですか?悲観的ロックの原則は理解できたと思いますが、よくわかりません。

4

1 に答える 1

1

このテストでは、悲観的ロックの動作を観察できますが、ロックを削除しても楽観的ロックには切り替わりません。それはまったくロックしません。

また、より慣用的にするには、次のようにすることもできます。

Thread.new do
  account = Account.first
  account.with_lock do
    account.balance += 250
    account.save!
  end
end

with_lockトランザクションを開始し、一度にロックを取得します。

lock_version楽観的ロックの動作を観察するには、モデルにフィールドが存在する必要があります。Rails はレコードのバージョン チェックを自動的に行いActiveRecord::StaleObjectError、コンフリクトを発生させます。

于 2016-06-30T11:18:09.477 に答える