ruby-on-rails - PostgreSQL + Rails 并发说明

标签 ruby-on-rails postgresql concurrentmodification

我正在构建一个后台作业,用于更新网络应用程序的用户统计信息。该作业目前需要 55-60 秒,我担心如果用户在作业运行的同时尝试加载他的统计页面会发生什么。

根据我对 PostgreSQL 和并发性的了解,如果两个客户端试图访问同一行(一个更新一个读取),并且我没有明确地开始任何事务,第一个只需要等待第二个完成。

因此,如果我的理解正确的话,我可能遭受的唯一性能损失是用户尝试在更新行的同时加载他的统计页面的可能性极小。在 55-60 秒的工作期间,整个统计表不会被锁定,除非我明确配置 Postgres 来这样做,对吧?

这是正确的解释吗?我还遗漏了其他因素吗?

(我提到 Rails 部分以防它与上述场景有任何关系)

(另:PostgreSQL 版本为 9.0.4)

最佳答案

这取决于事务隔离级别。如果我有你的情况——你是在谈论避免延迟的脏读。是的,如果您使用默认隔离级别,脏读是不可能的。只有当 Reader 尝试获取正在更新的同一行时,Reader 才会等待 writer。

Read Committed is the default isolation level in PostgreSQL. When a transaction runs on this isolation level, a SELECT query sees only data committed before the query began;

specs on ISOLATION

关于ruby-on-rails - PostgreSQL + Rails 并发说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9167930/

相关文章:

ruby-on-rails - Rails - Assets = false,引发runtimeError

sql - 如何在 SQL 查询中使用排序方式实现 GraphQL 游标

PostgreSQL group by date_trunc聚合索引大于不使用索引

java - Java 是否有支持并发修改的数据结构?

java - ConcurrentModificationException 的可能原因

java - 为什么列表的反向子列表的List.addAll导致ConcurrentModificationException

sql - 在 Postgres 的数组列中使用 UPCASE 或 Regexp

ruby-on-rails - Ruby on Rails 与 Paperclip : can't find paperclip. rb 初始值设定项

ruby-on-rails - 盆景Elasticsearch与Amazon Elasticsearch价格/月比较?

python - Django 测试需要很长时间才能启动