假设我正在像这样做(来自Active Record查询指南)
Item.transaction do
i = Item.first(:lock => true)
i.name = 'Jones'
i.save
end
事务结束后是否自动释放锁定?我查看了 Active Query 指南和 ActiveRecord::Locking::Pessimistic 文档,但没有找到明确说明锁定何时被释放。
假设我正在像这样做(来自Active Record查询指南)
Item.transaction do
i = Item.first(:lock => true)
i.name = 'Jones'
i.save
end
事务结束后是否自动释放锁定?我查看了 Active Query 指南和 ActiveRecord::Locking::Pessimistic 文档,但没有找到明确说明锁定何时被释放。
锁定并不是Rails的功能,而只是将锁定语句添加到查询中,这取决于您使用的数据库。悲观锁定采用“悲观”视角,认为每个查询都可能存在损坏的情况。因此,它将锁定所选行,直到您完成该事务。因此,锁定>查询>解锁。虽然这些在各种数据库之间相当一致,但最好阅读您正在使用的数据库文档,了解任何特定于数据库的内容。
这里有一个关于乐观锁定和悲观锁定的好帖子,比我更好地解释了这个问题。Optimistic vs. Pessimistic locking
我在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 def synchronize
lock
begin
yield
ensure
unlock
end
end
http://yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/ 似乎表明,该方法的块结构将自动解锁。