【问题标题】:Testing pessimistic locking with Rails使用 Rails 测试悲观锁定
【发布时间】:2016-06-30 11:08:58
【问题描述】:

为了更好地理解悲观锁(使用 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 然后包含750,然后在下一次命中时包含1500。不加锁,只考虑最后一个线程,结果为500

这是一个愚蠢的测试来尝试锁定与不锁定之间的区别吗?我认为我了解悲观锁定的原理,但不确定。

【问题讨论】:

    标签: ruby-on-rails multithreading innodb pessimistic-locking


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多