Rails中的悲观锁何时释放?

17
4个回答

27

锁定并不是Rails的功能,而只是将锁定语句添加到查询中,这取决于您使用的数据库。悲观锁定采用“悲观”视角,认为每个查询都可能存在损坏的情况。因此,它将锁定所选行,直到您完成该事务。因此,锁定>查询>解锁。虽然这些在各种数据库之间相当一致,但最好阅读您正在使用的数据库文档,了解任何特定于数据库的内容。

这里有一个关于乐观锁定和悲观锁定的好帖子,比我更好地解释了这个问题。Optimistic vs. Pessimistic locking


3
谢谢。我正在使用MySQL,所以我在文档中查找了相关信息,它说当事务提交或回滚时锁会被释放。我不知道在事务外部它是如何工作的。 - user26270
1
“锁定不是Rails的功能” - 乐观锁定是,而悲观锁定基于数据库的低级支持。 - Felixyz
它锁定了整个数据库?! - Ozymandias
@AjaxLeung 它只锁定行,而不是数据库或表格。我会编辑答案。 - Orlando

7

1
没错,这不是查询结束,而是事务结束。我已经修正了答案以避免混淆。 - lzap

0

我在rspec测试期间意识到了悲观锁定事务的问题。由于某些原因,在不同的系统上(我发现这是因为CI无法运行spec),记录仍然被锁定,无法获取。

因此,以下是代码和rspec示例。

class FooBar
  def foo
    Model.with_lock do
      model.update(bar: "baz")
    end
  end
end

红色示例

it "updates with lock" do
  expect { Foobar.foo }.to change { model.reload.bar }.to("baz")
end

但是正确的绿色示例应该看起来像这样

it "updates with lock" do
  Foobar.foo
  expect(model.reload.bar).to eq("baz")
end

你确定要使用 Model.with_lock 吗? - rony36
@rony36 你是什么意思? 它在所有最新版本的Rails中都有。 https://github.com/rails/rails/blob/09a2979f75c51afb797dd60261a8930f84144af8/activerecord/lib/active_record/locking/pessimistic.rb#L81 - zhisme

-3

4
这是错误的锁类型,数据库悲观锁与线程锁定。 - Omar Qureshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接