1

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

根据我对 PostgreSQL 和并发的阅读,如果两个客户端尝试访问同一行(一个更新和一个读取),并且我没有明确启动任何事务,第一个只需要等待第二个结束。

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

这是正确的解释吗?我还缺少其他因素吗?

(我提到 Rails 部分以防万一它与上述情况有任何关系)

(另外:PostgreSQL 版本是 9.0.4)

4

1 回答 1

2

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

Read Committed 是 PostgreSQL 中的默认隔离级别。当事务在此隔离级别上运行时,SELECT 查询只会看到在查询开始之前提交的数据;

隔离规格

于 2012-02-07T00:11:33.343 回答