带有 PG 的 Heroku 上的 Rails / ActiveRecord 真的这么慢吗?

Can Rails / ActiveRecord on Heroku with PG really be this slow?

在我的 Rails-application 中,我需要防止两个人被分配相同的案例。

我通过查看 "events" table 如果案例已经分配来做到这一点。如果没有,它被分配并创建一行说它已经分配。

这一切都有效 - 除了有时无效。如果两个人试图同时访问同一个案例(我们在同一几百毫秒内交谈),那么 events-table 似乎没有及时更新。

  1. 案例已分配给 User1。已保存到活动-table.
  2. 用户 2 要求分配相同的案例。检查事件-table 如果这个案例已经被分配。
  3. 相同的案例分配给了 User2,因为在我们检查 #2 时来自 #1 的写入尚未注册

我是 运行 Rails 5.0.2,在 Heroku 上使用 Postgres(Standard-2X dyno 和 Standard-2 Postgres)。

不幸的是,这样的事情并不少见。如果要避免多个threads/requests之间的资源争用,可以使用ActiveRecord Locking锁定有问题的Case记录。

我个人更喜欢 pessimistic locking,因为它开箱即用,在我看来,这就是那些数据库锁的用途。