ruby-on-rails – 使用Rails和Postgres,数据库锁不能正常工作

我在rails模型中有以下代码
foo = Food.find(...)
foo.with_lock do
  if bar = foo.bars.find_by_stuff(stuff)
    # do something with bar
  else
    bar = foo.bars.create!
    # do something with bar
  end
end

目标是确保创建的类型的Bar不会被创建两次.

在控制台上测试with_lock确认了我的期望.但是,在生产中,似乎在某些或所有情况下,锁未按预期工作,并且正在尝试使用冗余Bar – 因此,with_lock不会(总是?)导致代码等待轮到.

这可能会发生什么?

更新
很抱歉所有说“锁定foo不会帮助你”的人!我的例子最初没有查找条形码.这是现在修复的.

解决方法

锁定在查询缓存中的Rails应用程序中无法正常工作的原因.

如果您尝试在单个请求中多次在同一行上获取独占锁,则查询缓存会启动,因此后续锁定查询永远不会到达数据库本身.

在Github上The issue has been reported.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...