我正在构建一个后台作业,用于更新网络应用程序的用户统计信息。该作业目前需要 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;
关于ruby-on-rails - PostgreSQL + Rails 并发说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9167930/