Ruby on rails 什么时候在rails中释放悲观锁?

Ruby on rails 什么时候在rails中释放悲观锁?,ruby-on-rails,locking,pessimistic,Ruby On Rails,Locking,Pessimistic,假设我正在做这样的事情(从 是否在事务结束时自动释放锁?我已经查看了Active Query guide(活动查询指南)和,但找不到它明确指出锁释放位置的位置。我相信您需要一个“确保”块来确保锁释放 有: 但是,似乎表明该方法的块结构将自动解锁。锁定不是rails的功能,它只是将lock语句添加到查询中,这取决于您使用的数据库。悲观锁定采用“悲观”的观点,认为每个查询都会受到损坏。因此,它将锁定选定的行,直到您完成事务。所以锁定>查询>解锁。虽然这些都是相当一致的数据库到数据库,但最好阅读用于任

假设我正在做这样的事情(从

是否在事务结束时自动释放锁?我已经查看了Active Query guide(活动查询指南)和,但找不到它明确指出锁释放位置的位置。

我相信您需要一个“确保”块来确保锁释放

有:


但是,似乎表明该方法的块结构将自动解锁。

锁定不是rails的功能,它只是将lock语句添加到查询中,这取决于您使用的数据库。悲观锁定采用“悲观”的观点,认为每个查询都会受到损坏。因此,它将锁定选定的行,直到您完成事务。所以锁定>查询>解锁。虽然这些都是相当一致的数据库到数据库,但最好阅读用于任何数据库特定内容的数据库文档


这里有一个关于乐观锁和悲观锁的好线索,它比我能更好地解释这一点

是的,锁在事务结束时自动释放,因为这种锁仅适用于事务。在事务之外以这种方式锁定记录(悲观锁)是没有意义的

悲观锁在数据库级别强制执行

以下是mysql的示例说明:

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

下面是代码和rspec示例

class FooBar
德福
型号.带锁do
型号更新(条形图:“baz”)
结束
结束
结束
红色示例

it“用锁更新”do
期望{Foobar.foo}.将{model.reload.bar}.更改为(“baz”)
结束
但正确的绿色示例应如下所示

it“用锁更新”do
Foobar.foo
expect(model.reload.bar.)到eq(“baz”)
结束

谢谢。我使用的是mySQL,所以我在这些文档中查找了它,它说当事务提交或回滚时,锁被释放。我不知道它在事务之外是如何工作的。“锁定不是rails的功能”--乐观锁定是,而悲观锁定是基于DB的低级支持。它锁定整个数据库@AjaxLeung它只是锁定行,而不是数据库或表。我将编辑答案这是一种错误的锁,数据库悲观锁与线程锁这是正确的,这不是查询结束,而是事务结束。我修正了prefent困惑的答案。你确定这个
型号吗?带锁的
?@rony36你是什么意思?它在所有最新版本的rails中都存在
Item.transaction do  
  i = Item.first(:lock => true)  
  i.name = 'Jones'  
  i.save 
end 
  def synchronize
    lock
    begin
      yield
    ensure
      unlock
    end
  end